एक गैर-संवादात्मक शेल में स्क्रिप्ट चलाएं?


17

मेरे पास एक क्रॉन काम है जो एक स्क्रिप्ट चला रहा है। जब मैं एक संवादात्मक शेल के माध्यम से स्क्रिप्ट चलाता हूं (बैश करने के लिए ssh'ed) तो यह ठीक काम करता है। जब स्क्रिप्ट क्रोन के माध्यम से अपने आप चलती है तो वह विफल हो जाती है।

मेरा अनुमान है कि यह इंटरेक्टिव शेल में सेट किए गए कुछ पर्यावरण चर का उपयोग कर रहा है। मैं स्क्रिप्ट का निवारण करने जा रहा हूं और इन्हें हटा दूंगा।

मैं परिवर्तन करने के बाद, मुझे पता है कि मैं क्रोन में स्क्रिप्ट को कतारबद्ध कर सकता हूं, क्योंकि यह सामान्य रूप से चलेगा, लेकिन क्या कोई तरीका है जो मैं कमांड लाइन से स्क्रिप्ट को चला सकता हूं, लेकिन इसे चलाने के लिए बताएं जैसे कि यह क्रोन से होगा - एक गैर-संवादात्मक वातावरण में?


संबंधित और इस प्रकार संभवतः उपयोगी है: "एक ksh खोल में एक स्वच्छ वातावरण कैसे प्राप्त करें?" विशेष रूप से @Gilles उत्तर के बारे में देखें unset
sr_

1
@ Sr_ के लिंक से, मैंने देखा env, और आप कोशिश करना चाह सकते हैं env -i ./my-script.sh। इसके अलावा, क्या आपको एक त्रुटि संदेश मिल रहा है?
केविन

आप किस क्रोन कार्यान्वयन का उपयोग कर रहे हैं?
rozcietrzewiacz

@kevin - यदि आप इसके साथ उत्तर देते हैं तो मैं इसे बढ़ा दूंगा।
cwd

जवाबों:


12

क्रॉन से कमांड चलाने और कमांड लाइन पर चलने के बीच मुख्य अंतर हैं:

  • क्रोन शायद एक अलग शेल (आम तौर पर /bin/sh) का उपयोग कर रहा है ;
  • क्रोन निश्चित रूप से एक छोटे वातावरण में चल रहा है (जो लोग क्रोन कार्यान्वयन पर निर्भर करते हैं, इसलिए cron(8)या crontab(5)मैन पेज की जांच करें ; आम तौर पर बस HOME, शायद SHELL, शायद LOGNAME, शायद USER, और एक छोटा सा PATH);
  • क्रॉन %विशेष रूप से चरित्र का इलाज करता है (इसे एक नई रेखा में बदल दिया जाता है);
  • क्रोन नौकरियां बिना टर्मिनल या ग्राफिकल वातावरण के चलती हैं।

निम्नलिखित आह्वान शेल स्निपेट को बहुत अधिक चलाएगा जैसे कि यह क्रोन से लाया गया था। मुझे लगता है कि स्निपेट में वर्ण शामिल नहीं हैं 'या %

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

क्रोन से एक स्क्रिप्ट को निष्पादित करना भी देखें , जो आपकी समस्या को हल करने में मदद कर सकता है।


हाय @Giles - बस कुछ के बारे में सोचा - एक स्क्रिप्ट चलाने की तरह sudo -u user /path/to/scriptयह भी किसी भी चर सेट के बिना इसे चलाने के लिए एक तरीका हो सकता है?
19

@cwd नहीं, आमतौर पर नहीं। sudoकुछ चर को साफ करता है और दूसरों को एक ज्ञात मूल्य पर सेट करता है, लेकिन यह इस बात पर निर्भर करता है कि यह कैसे कॉन्फ़िगर किया गया है। यह अक्सर स्थानीय सेटिंग्स को बनाए रखने के लिए कॉन्फ़िगर किया जाता है और TERM, उदाहरण के लिए।
गाइल्स एसओ- बुराई को रोकना '

2

@ Sr_ के लिंक से ( ksh शेल में स्वच्छ वातावरण कैसे प्राप्त करें? ), मैंने env को देखा, और आप यह कोशिश करना चाह सकते हैं:

env -i ./my-script.sh

यह मेरे लिए अच्छी तरह से काम किया, हालांकि @Gilles उत्तर भी वास्तव में अच्छा है।
cwd

@ सीडब्ल्यूडी: मेरे लिए काम नहीं करता है: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shआउटपुट interactive himB
एलिक्स एक्सल

1

मैं आपको सुझाव दूंगा कि आप अपनी लिपियों के लिए निरपेक्ष रास्तों का उपयोग करें जब इसे क्रोन में डालकर और कहीं और उपयोग किया जाए और इसमें उपयोग किए जाने वाले किसी भी और सभी लिनक्स कमांडों को बेहतर रूप से चर के रूप में घोषित करें और इसका उपयोग करें!


हाँ। लेकिन निश्चित रूप से।
cwd

0

क्रोन जरूरी उसी शेल का उपयोग नहीं करता है जिसका आप उपयोग कर रहे हैं। चेक:

cat /etc/crontab |grep SHELL

वहाँ अपनी स्क्रिप्ट के खोल और प्रयास निष्पादन का निर्धारण करने के लिए - क्या यह काम करता है? यह कई लोगों के लिए स्क्रिप्ट को क्रोन में जोड़ने का एक आम कारण है।

यदि यह समस्या है - आप इस स्क्रिप्ट को बैश में निष्पादित करने के लिए मजबूर करने के लिए क्रोन में अपनी स्क्रिप्ट की शुरुआत में "बैश" जोड़ सकते हैं। यदि यह समस्या हल नहीं होती है, तो मुझे बताएं और मैं थोड़ा गहरा खुदाई करूंगा।


0

यदि आप कुछ स्क्रिप्ट द्वारा प्रदान किए गए कुछ इंटरैक्टिव सवालों को अनदेखा करना चाहते हैं, तो आप कोशिश कर सकते हैं:

yes | your_command

या yes "n"यदि आप सभी प्रश्न नहीं करना चाहते हैं।

कमान:

हाँ - दोहराव की पुष्टि हो, हाँ हमेशा के लिए, या, डिफ़ॉल्ट रूप से, '' y '' का उत्पादन करता है।


0

अपनी स्क्रिप्ट को एक गैर-इंटरैक्टिव शेल में चलाने के लिए (विवरण के बारे में नहीं cron), आप इसके माध्यम से कर सकते हैं ssh

परीक्षण करें यदि आप वास्तव में एक गैर-इंटरैक्टिव शेल में समाप्त होते हैं:

> ssh someuser@somehost tty
not a tty

एक गैर-संवादात्मक शेल में स्क्रिप्ट निष्पादित करें:

> ssh someuser@somehost /tmp/myscript.sh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.