जब क्रोन किसी कार्य को अंजाम देता है तो 'वर्किंग डायरेक्टरी' क्या होती है?


170

मेरे पास एक स्क्रिप्ट है जो काम करता है जब मैं इसे कमांड लाइन से चलाता हूं, लेकिन जब मैं इसे शेड्यूल करता हूं तो मुझे cronत्रुटियां मिलती हैं कि यह फाइलें या कमांड नहीं मिल सकती हैं। मेरा सवाल दुगना है:

  1. जब मैं एक क्रोन जॉब का उपयोग crontab -eकरता हूं, तो क्या यह मेरी उपयोगकर्ता आईडी का उपयोग इसकी अनुमति के आधार के रूप में करता है? या यह किसी प्रकार की क्रोन उपयोगकर्ता आईडी और उससे संबंधित अनुमतियों का उपयोग करता है?

  2. जब एक क्रोन नौकरी शुरू की जाती है, तो कार्यशील निर्देशिका क्या होती है? क्या यह वह निर्देशिका है जहां मैं स्क्रिप्ट को चलाने के लिए निर्दिष्ट करता हूं, या एक अलग निर्देशिका?

यहाँ मेरी क्रोन नौकरी है:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

यहाँ वास्तविक स्क्रिप्ट है:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp XXXXX@gmail.com < emailmsg.txt

जब मैं अपने mailद्वारा उत्पादित संदेश को देखता हूं तो मुझे यहां मिलने वाली त्रुटियां हैं cron:

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found

यह नहीं मिल सकता है template.txtलेकिन यह स्क्रिप्ट के समान निर्देशिका में रहता है। यह भी नहीं चल सकता है ssmtp, लेकिन मैं अपना उपयोगकर्ता बन सकता हूं। इसे ठीक से काम करने के लिए मुझे क्या याद आ रहा है?

जवाबों:


158

जोड़े cd /home/xxxx/Documents/Scripts/यदि आप अपने काम है कि निर्देशिका में चलाना चाहते हैं। ऐसा कोई कारण नहीं है कि क्रोन उस विशेष निर्देशिका में बदल जाए। Cron आपके होम डायरेक्टरी में आपके कमांड चलाता है।

के रूप में ssmtp, यह आपके डिफ़ॉल्ट में नहीं हो सकता है PATH। क्रोन का डिफ़ॉल्ट पथ कार्यान्वयन-निर्भर है, इसलिए अपने मैन पेज की जांच करें, लेकिन सभी संभावना ssmtpमें /usr/sbinवह नहीं है जो आपके डिफ़ॉल्ट में नहीं है PATH, केवल रूट का है।

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh

@ गिल्स - धन्यवाद, cronयह स्वयं का होगा PATHया मैं अपने उपयोगकर्ता की जांच कर सकता हूं PATH? मैंने ssmtp सेट किया है कि यह स्वयं का है userऔर wheelयह सोचने की अनुमति है कि यह किसी को भी इसका उपयोग करने की अनुमति देगा (क्रोन सहित)। अगर यह Im को CENTOS 6.2 में मदद करता है
व्यावसायिक

3
@ProfessionalAmateur आपकी समस्या यह नहीं है कि आपको उपयोग करने की अनुमति नहीं है ssmtp, लेकिन यह है कि आपकी क्रोन नौकरी को कोई निष्पादन योग्य नहीं कहा जाता है ssmtpक्योंकि यह आपके में नहीं है PATH। "आपके उपयोगकर्ता" जैसी कोई चीज नहीं है PATH; यह एक प्रति-प्रक्रिया सेटिंग है, प्रति-उपयोगकर्ता सेटिंग नहीं है। आप PATH=…अपने क्रोनब में एक लाइन लगाकर अपने सभी क्रोन नौकरियों के लिए रास्ता तय कर सकते हैं ।
गाइल्स

मुझे PAILH सेटअप के साथ-साथ काम करने के लिए MAILTO='XXXX@gmail.com को भी जोड़ना पड़ा। Wierd लेकिन यह मेरे लिए काम किया।
मैक

Ssmtp के लिए कोई भी उपयोग कर सकता है; ´which ssmtp´ ...
फ्रेड्रिक गॉस ने


20

यदि आपका क्रोनजोब एक बैश स्क्रिप्ट है, तो निम्नलिखित आपकी स्क्रिप्ट के स्थान पर जाएगा (यह मानते हुए कि आप अपनी क्रोन परिभाषा में पूर्ण पथ का उपयोग कर रहे हैं):

cd "$(dirname "$0")";

14

प्रश्न 1 का उत्तर देने के लिए: यदि आप crontab -eअपने स्वयं के उपयोगकर्ता के रूप में चलाते हैं , तो कार्य उस उपयोगकर्ता के कॉन्टैब में निर्धारित किए जाएंगे और इस प्रकार उस उपयोगकर्ता की अनुमति से चलेंगे।

लेकिन आपको यह विचार करने की आवश्यकता है कि नौकरियां एक गैर-संवादात्मक शेल में चलेंगी जिसका अर्थ है कि कमांड लाइन से स्क्रिप्ट को चलाने पर $ PATH आपके पास से भिन्न हो सकती है।

लिपियों में हमेशा पूर्ण पथ का उपयोग करना सबसे अच्छा है, खासकर यदि आप उन्हें / क्रोन आदि के माध्यम से शेड्यूल करने की योजना बनाते हैं।

मैं भी सभी समस्याओं से बचने के लिए सभी फ़ाइलों के लिए पूर्ण पथ का उपयोग करने की सलाह दूंगा।

दौड़ की स्थिति और अन्य सुरक्षा मुद्दों को रोकने के लिए, आपको यह भी mktempसुनिश्चित करने के लिए उपयोग करना चाहिए कि आपके द्वारा पढ़ी गई फ़ाइल आपकी स्क्रिप्ट के बाहर किसी भी चीज़ से संशोधित नहीं है।

इसलिए मैं स्क्रिप्ट को कुछ इस तरह से बदलूंगा:

vIP_ADDR="`curl automation.whatismyip.com/n09230945.asp`"
echo "$vIP_ADDR"
mail_msg=`/bin/mktemp`
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp XXXXX@gmail.com < $mailmsg
/bin/rm $mailmsg

7

cronप्रत्येक उपयोगकर्ता की निर्धारित नौकरियों को उस उपयोगकर्ता के रूप में चलाता है। हमें यह पता लगाने के लिए पर्याप्त होना चाहिए कि यह आपकी स्क्रिप्ट को आपकी होम निर्देशिका के सापेक्ष चलाता है।

यदि आपको इसे किसी अन्य स्थान से चलाने की आवश्यकता है, तो cdउस स्थान पर जाने के लिए बस अपनी स्क्रिप्ट का उपयोग करें।

ssmtpसंभवत: cronडिफ़ॉल्ट PATH में नहीं है (यह अधिकांश प्लेटफार्मों पर डिज़ाइन द्वारा बहुत संकीर्ण होने के लिए सेट है)। आप ssmtpअपनी स्क्रिप्ट में या तो पूर्ण पथ निर्दिष्ट कर सकते हैं , या आप स्पष्ट रूप से PATH को) अपनी crontab फ़ाइल में सेट कर सकते हैं, जो प्रत्येक स्क्रिप्ट में आपकी सभी लिपियों, या b) के लिए उपलब्ध होगी।


3

इस धागे की जांच करें कि आप आसानी से क्रोन के वातावरण का कैसे पता लगा सकते हैं, यह एक इंटरेक्टिव शेल में उपयोग किए जाने की तुलना में बहुत कम है। सर्वश्रेष्ठ यह है कि कुछ भी निर्धारित नहीं किया गया है और स्पष्ट रूप से इसे स्वयं निर्धारित किया गया है।


1

cronआमतौर पर नौकरी को निष्पादित करने के लिए डिफ़ॉल्ट वर्किंग डायरेक्टरी होम डाइरेक्टरी होती है /home/your-user-name

@ कुसलानंद की उत्कृष्ट टिप्पणी को अपनाना।


1
नहीं। यह इस बात पर निर्भर करता है कि सिस्टम होम डाइरेक्टरी को कहाँ रखता है। /homeसार्वभौमिक से बहुत दूर है।
कुसलानंद

1
@ कुसलानंद LSB मानक कहता है /home
पेटेर

1
@peterh खैर, /UsersmacOS का उपयोग करता है और ऐतिहासिक यूनियनों का उपयोग करता है /usr, और यहां तक ​​कि लिनक्स पर भी, एक सिस्टम उपयोगकर्ता के घर की निर्देशिका अच्छी तरह से कहीं और के तहत हो सकती /varहै।
Kusalananda

1
@ कुसलानंद यह सही है।
पेटेर

धन्यवाद, आप एकमात्र व्यक्ति हैं जिसने वास्तव में इस प्रश्न का उत्तर दिया :)
OwN

0

कुछ लोगों ने संकेत दिया है या उस पर जुड़ा हुआ है, लेकिन यह पता लगाने का सबसे अच्छा तरीका है कि मैं इसे अपने डिस्ट्रो के लिए आदमी डॉक्स में नहीं पा सकता हूं

* * * * * echo $PATH > /tmp/lolcronjobs

मेरे मामले में ubuntu केवल /usr/bin:/binकुछ मुद्दों के कारण जिसके उपयोग से चूक हुई।

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