क्रोन का पैट सेट कहां है?


34

क्रोन उपयोगकर्ता के पथ का उपयोग नहीं करता है जिसका क्रेस्टैब है और इसके बजाय, इसका अपना है। 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अपने आप में हार्डकोड है? क्या यह इसके लिए किसी प्रकार की कॉन्फ़िगरेशन फ़ाइल नहीं पढ़ता है?


3
किसी विशेष शेल cronको देखने /etc/profileया उसकी देखभाल करने का कोई कारण नहीं है । एक बेहतर सवाल यह है कि (लिनक्स पर) या (बीएसडी पर ) से क्यों नहीं cronपढ़ा PATHजाता है । मुझे लगता है कि यह अंततः एक कार्यान्वयन विवरण है। login.defslogin.conf
सातु कटुरा

@ Sat usesKatsura यकीन है, मैंने केवल /etc/profileइसलिए उल्लेख किया है क्योंकि यह स्वयं के समान सिंटैक्स ( var=value) का उपयोग करता cronहै, इसलिए यह करना आसान है और /etc/profileमेरे ज्ञान के लिए, बहुत व्यापक है। मुझे जो आश्चर्य हुआ वह यह है कि मैं इसे कहीं भी सेट नहीं कर सकता था इसलिए ऐसा लग रहा था कि यह कठिन कोडित है। जैसा कि वास्तव में मामला है, जैसा कि स्टीफन ने नीचे बताया है।
terdon

zshउनके इंटरेक्टिव शेल के रूप में उपयोग करने वाले लोग इसकी परवाह नहीं करते /etc/profile(जो कि विशिष्ट है bash)
बेसिल स्टायरनेविच

2
@BasileStarynkevitch नहीं, यह पार्टी के लिए विशिष्ट नहीं है सब पर ! बिल्कुल इसके विपरीत! जबकि कुछ गोले हैं जो इसे नहीं पढ़ते हैं (सी-शेल परिवार AFAIK), zsh उनमें से एक नहीं है। अगर आप मुझ पर विश्वास नहीं करते हैं, तो zsh मैनपेज देखें। किसी भी मामले में, इंटरैक्टिव गोले अप्रासंगिक हैं क्योंकि विभिन्न profileफाइलें केवल लॉगिन गोले द्वारा पढ़ी जाती हैं, वैसे भी। ये इंटरएक्टिव हो सकते हैं या नहीं भी।
terdon

1
कभी-कभी stringsकिसी प्रोग्राम के खिलाफ चलने से इन हार्ड-कोडेड मानों को खोजने में मदद मिल सकती है।
jrw32982

जवाबों:


47

यह स्रोत कोड में हार्ड-कोडेड है (जो कि वर्तमान डेबियन के लिंक को इंगित करता है cron- cronकार्यान्वयन की विविधता को देखते हुए , इसे चुनना मुश्किल है, लेकिन अन्य कार्यान्वयन समान हैं):

#ifndef _PATH_DEFPATH
# define _PATH_DEFPATH "/usr/bin:/bin"
#endif

#ifndef _PATH_DEFPATH_ROOT
# define _PATH_DEFPATH_ROOT "/usr/sbin:/usr/bin:/sbin:/bin"
#endif

cronकॉन्फ़िगरेशन फ़ाइल से डिफ़ॉल्ट पथ नहीं पढ़ता है; मुझे लगता है कि तर्क यह है कि यह पहले से ही PATH=किसी भी क्रोनजॉब में उपयोग करने वाले निर्दिष्ट रास्तों का समर्थन करता है , इसलिए कहीं और डिफ़ॉल्ट रूप से निर्दिष्ट करने में सक्षम होने की आवश्यकता नहीं है। (हार्ड-कोडेड डिफॉल्ट का उपयोग किया जाता है यदि नौकरी प्रविष्टि में कुछ और निर्दिष्ट नहीं करता है ।)


ध्यान दें कि, _PATH_DEFPATH_ROOTपरिभाषित होने के बावजूद , मैंने डेबियन स्ट्रेच पर echo $PATH > /testfileरूट के क्रॉस्टब का उपयोग करके संपादन करने के बाद पुष्टि की (क्रोन जॉब का उपयोग करके ) crontab -eकि रूट का क्रॉस्टैब भी उपयोग करता है _PATH_DEFPATH, अर्थात "/ usr / bin: / bin", नहीं _PATH_DEFPATH_ROOT । इस उत्तर में दूसरे स्रोत कोड लिंक (जिसमें _PATH_DEFPATH_ROOTइसका उपयोग नहीं किया गया है) द्वारा भी इसकी पुष्टि की जाती है । मेरे लिए यह स्पष्ट नहीं है कि यह अनाथ परिभाषित एक बग है या नहीं।
njahnke

8

स्टीफन किट के उत्तर में जोड़ते हुए, एक कॉन्फ़िगरेशन फ़ाइल होती है जो PATHउबंटू पर क्रोन के लिए सेट होती है , और यह cron ध्यान नहीं देती है कि PATHहार्ड-कोडेड डिफ़ॉल्ट (या PATHस्वयं crontabs में सेट) का उपयोग करने के लिए। फ़ाइल है /etc/environment। नोट cronका PAM विन्यास:

$ cat /etc/pam.d/cron
...   
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session       required   pam_env.so

# In addition, read system locale information
session       required   pam_env.so envfile=/etc/default/locale
...

यह आसानी से सत्यापन योग्य है। एक चर जोड़ें /etc/environment, कहते हैं foo=bar, env > /tmp/fooक्रोनजोब के रूप में चलाएं और foo=barआउटपुट में शो के रूप में देखें।


पर क्यों? डिफ़ॉल्ट सिस्टम-वाइड पथ / etc / प्रोफ़ाइल में सेट है, लेकिन इसमें अन्य निर्देशिकाएं शामिल हैं:

$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"

यह आर्क लिनक्स में सच है, लेकिन उबंटू में, बेस PATHमें सेट है /etc/environment/etc/profile.dमौजूदा से निपटने के लिए फ़ाइलें PATH, और आप इसमें संलग्न कर सकते हैं ~/.pam_environment। मेरे पास आर्क के व्यवहार के बारे में एक बग दर्ज है

दुर्भाग्य से, /etc/pam.d/cronपढ़ना शामिल नहीं है ~/.pam_environment। अजीब तरह से, उस फ़ाइल /etc/pam.d/atd को शामिल करता है :

$ cat /etc/pam.d/atd
#
# The PAM configuration file for the at daemon
#

@include common-auth
@include common-account
session    required   pam_loginuid.so
@include common-session-noninteractive
session    required   pam_limits.so
session    required   pam_env.so user_readenv=1

... लेकिन कमांड काम के atदौरान उपलब्ध पर्यावरण को स्पष्ट रूप से प्राप्त करते हैं at(उदाहरण के लिए, env -i /usr/bin/at ...एक बहुत ही स्वच्छ वातावरण के साथ नौकरी चलाने के लिए लगता है)।

संशोधन /etc/pam.d/cronके लिए user_readenv=1में कोई समस्या नहीं है, और चर का कारण बन रहा है ~/.pam_environmentदिखाने शुरू कर दिया ठीक (के अलावा PATHनिश्चित रूप से,)।


सभी ने बताया, क्रोन के लिए पर्यावरण चर सेट करना एक गन्दा व्यवसाय लगता है। सबसे अच्छा स्थान नौकरी विनिर्देश में ही प्रतीत होता है, यदि केवल इसलिए कि आपको नहीं पता है कि विरासत में मिला पर्यावरण चर किनरों को अनदेखा कर सकता है (स्रोत को पढ़े बिना)।


atनौकरियों के बारे में , यदि आप एक atनौकरी डंप करते हैं तो आप देखेंगे कि यह स्पष्ट रूप से पर्यावरण को पर्यावरण से मेल खाने के लिए सेट करता है जब नौकरी बनाई गई थी।
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.