क्रोन उपयोगकर्ता के पथ का उपयोग नहीं करता है जिसका क्रेस्टैब है और इसके बजाय, इसका अपना है। PATH=/foo/bar
क्रॉस्टैब की शुरुआत में इसे आसानी से बदला जा सकता है , और क्लासिक वर्कअराउंड हमेशा क्रोन द्वारा संचालित कमांड के लिए निरपेक्ष पथों का उपयोग करना है, लेकिन क्रोन के डिफ़ॉल्ट पैट को कहां परिभाषित किया गया है?
मैंने अपने आर्क सिस्टम पर निम्नलिखित सामग्री के साथ एक क्रॉस्टैब बनाया (1.5-1-1) और इसके परिणामों के साथ उबंटू 16.04.3 एलटीएस बॉक्स पर भी परीक्षण किया गया:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
वह मुद्रित:
$ cat fff
/usr/bin:/bin
पर क्यों? डिफ़ॉल्ट सिस्टम-वाइड पथ में सेट है /etc/profile
, लेकिन इसमें अन्य निर्देशिकाएं शामिल हैं:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
में प्रासंगिक और कुछ नहीं है /etc/environment
या /etc/profile.d
, अन्य फ़ाइलों मैंने सोचा कि संभवतः क्रॉन द्वारा पढ़ा जा सकता है:
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl ] && PATH=$PATH:/usr/bin/vendor_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/vendor_perl/bin ] && PATH=$PATH:/usr/lib/perl5/vendor_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/core_perl ] && PATH=$PATH:/usr/bin/core_perl
वहाँ भी फाइलों में से किसी में प्रासंगिक कुछ भी नहीं है /etc/skel
, आश्चर्य, न ही यह किसी में सेट किया जा रहा है /etc/cron*
फ़ाइल:
$ grep PATH /etc/cron* /etc/cron*/*
grep: /etc/cron.d: Is a directory
grep: /etc/cron.daily: Is a directory
grep: /etc/cron.hourly: Is a directory
grep: /etc/cron.monthly: Is a directory
grep: /etc/cron.weekly: Is a directory
/etc/cron.d/0hourly:PATH=/sbin:/bin:/usr/sbin:/usr/bin
तो, उपयोगकर्ता crontabs के लिए Cron का डिफ़ॉल्ट PATH कहां सेट किया जा रहा है? क्या यह cron
अपने आप में हार्डकोड है? क्या यह इसके लिए किसी प्रकार की कॉन्फ़िगरेशन फ़ाइल नहीं पढ़ता है?
/etc/profile
इसलिए उल्लेख किया है क्योंकि यह स्वयं के समान सिंटैक्स ( var=value
) का उपयोग करता cron
है, इसलिए यह करना आसान है और /etc/profile
मेरे ज्ञान के लिए, बहुत व्यापक है। मुझे जो आश्चर्य हुआ वह यह है कि मैं इसे कहीं भी सेट नहीं कर सकता था इसलिए ऐसा लग रहा था कि यह कठिन कोडित है। जैसा कि वास्तव में मामला है, जैसा कि स्टीफन ने नीचे बताया है।
zsh
उनके इंटरेक्टिव शेल के रूप में उपयोग करने वाले लोग इसकी परवाह नहीं करते /etc/profile
(जो कि विशिष्ट है bash
)
profile
फाइलें केवल लॉगिन गोले द्वारा पढ़ी जाती हैं, वैसे भी। ये इंटरएक्टिव हो सकते हैं या नहीं भी।
strings
किसी प्रोग्राम के खिलाफ चलने से इन हार्ड-कोडेड मानों को खोजने में मदद मिल सकती है।
cron
को देखने/etc/profile
या उसकी देखभाल करने का कोई कारण नहीं है । एक बेहतर सवाल यह है कि (लिनक्स पर) या (बीएसडी पर ) से क्यों नहींcron
पढ़ाPATH
जाता है । मुझे लगता है कि यह अंततः एक कार्यान्वयन विवरण है।login.defs
login.conf