क्रॉन ".bashrc" और ".bash_profile" में परिभाषित चर की उपेक्षा करता है


49

मैंने "शेल" चर / etc / crontab फ़ाइल में परिभाषित किया है:

[martin@martin ~]$ grep SHELL /etc/crontab 
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$ 

इसके अलावा, मेरी सभी स्क्रिप्ट्स / etc / crontab फ़ाइल उपयोगकर्ता "मार्टिन" के तहत शुरू की जाती हैं। हालाँकि /home/martin/.bash_profile (लॉगिन शेल के लिए) और /home/martin/.bashrc (नॉन-लॉगिंग शेल के लिए) में कुछ चर होते हैं जिन्हें क्रॉन जॉब के मामले में नजरअंदाज कर दिया जाता है, लेकिन इस मामले में मैं मशीन में लॉग इन करता हूं SSH या नया बैश सत्र खोलें। क्रॉन उन चरों की उपेक्षा क्यों करता है? क्या क्रोन केवल "/ usr / स्थानीय / बिन / bash my-script.sh" को उपयोगकर्ता "मार्टीन" के लिए अनुमतियों के साथ निष्पादित नहीं कर रहा है?


2
उबंटू उपयोगकर्ता यह नोट करना पसंद कर सकते हैं कि उबंटू की डिफ़ॉल्ट .bashrcमें एक पंक्ति है जो इसे गैर-संवादात्मक गोले में चलने से रोकती है
joeytwiddle

जवाबों:


72

आप उस फ़ाइल को स्रोत कर सकते हैं जिसे आप स्क्रिप्ट के शीर्ष पर चाहते हैं या उस उपयोगकर्ता के लिए काम शुरू कर रहे हैं जो नौकरी निष्पादित कर रहा है। "स्रोत" कमांड एक अंतर्निहित है। यदि आप उन फ़ाइलों को परिवर्तन लोड करने के लिए संपादन करते हैं, तो आप वही काम करेंगे।

* * * * * source /home/user/.bash_profile; <command>

या

#!/bin/bash
source /home/user/.bash_profile

<commands>

2
ध्यान दें कि "स्रोत" काम नहीं कर सकता है यदि क्रोन bashशेल का उपयोग नहीं कर रहा है। मैंने एक उत्तर जोड़ा है जो शेल होने पर मामले को संभाल सकता है sh
जोनाथन


23

क्योंकि यह एक इंटरैक्टिव शेल नहीं है। ऐसा ही तब होता है जब आप कुछ टर्मिनल खोलते हैं।

इस प्रश्न पर एक नज़र डालें: .bashrc फ़ाइल क्या है? | सुपर यूजर

और इस एक पर भी:

.Bashrc, .bash_profile और .environment के बीच क्या अंतर है? | स्टैक ओवरफ़्लो

यदि कनेक्शन एक लॉगिन शेल (या नहीं), एक इंटरैक्टिव शेल (या नहीं), या दोनों के आधार पर अलग-अलग स्क्रिप्ट आग है।

यदि आप bashrc बनाना चाहते हैं तो आपको यह बदलाव करने की आवश्यकता होगी:

जब बैश को गैर-अंतःक्रियात्मक रूप से शुरू किया जाता है, तो शेल स्क्रिप्ट को चलाने के लिए, उदाहरण के लिए, यह पर्यावरण में चर BASH_ENV की तलाश करता है, यदि यह वहां दिखाई देता है, तो इसका मान बढ़ाता है, और पढ़ने और निष्पादित करने के लिए फ़ाइल के नाम के रूप में विस्तारित मान का उपयोग करता है। । बैश ऐसा व्यवहार करता है जैसे कि निम्नलिखित आदेश निष्पादित किए गए थे:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

लेकिन फ़ाइल नाम की खोज करने के लिए PATH चर का मान उपयोग नहीं किया जाता है।

जैसा कि ऊपर उल्लेख किया गया है, यदि एक गैर-इंटरैक्टिव शेल --loginविकल्प के साथ लगाया जाता है , तो बैश लॉगिन शेल स्टार्टअप फ़ाइलों से कमांड को पढ़ने और निष्पादित करने का प्रयास करता है।

स्रोत: बैश स्टार्टअप फाइलें | बैश संदर्भ मैनुअल | gnu.org


इसलिए यदि हम Cron के अंदर BASH_ENV सेट करते हैं, तो क्रोन बैश स्क्रिप्ट स्रोत होगा क्योंकि क्रोन गैर-संवादात्मक और गैर-लॉगिन है।
CMCDragonkai

12

sourceयदि shशेल का उपयोग किया जा रहा है तो आप चलाने में सक्षम नहीं हो सकते हैं । इसे अपने कॉन्ट्राब में निम्नलिखित पंक्ति जोड़कर बदला जा सकता है:

SHELL=/bin/bash
* * * * * source "/root/.bashrc"; <command>

आप पर्यावरण को भी निर्दिष्ट कर सकते हैं:

BASH_ENV="/root/.bashrc"
* * * * * <command>

या यदि आप /home/user/.bashrcएक उपयोगकर्ता क्रोन जॉब (जैसे crontab -e) है तो आप अपने स्थानीय का उपयोग कर सकते हैं ।

ध्यान दें कि अगर यह मौजूद है, तो इसे .bash_profileबदल सकते हैं .bashrc

क्रेडिट: क्रोन शेल (बाश करने के लिए) कैसे बदलें?


यह एक्वायिया क्लाउड शेड्यूल्ड जॉब्स के लिए भी अच्छा काम करता है, जो मूल रूप से क्रॉन जॉब्स हैं। आप ऐसा ही कर सकते हैं, जैसे:SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
अलेजांद्रो मोरेनो

1

कुछ और जो आपके .bashrcक्रोनजॉब से आपके सोर्सिंग में हस्तक्षेप कर सकता है, वह है किसी भी तरह की जांच जो यह फाइल इंटरेक्टिव शेल का पता लगाने के लिए करती है।

उदाहरण के लिए, Ubuntu 18.04 पर, .bashrcएक उपयोगकर्ता के लिए डिफ़ॉल्ट इसके साथ शुरू होता है:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

और इसलिए सोर्सिंग यह कुछ भी उपयोगी नहीं होगा क्योंकि यह तुरंत बाहर निकल जाएगा।


1

आप -lइस तरह से विकल्प के साथ बैश लगा सकते हैं :

* * * * * /bin/bash -l /path/to/script arg1 arg2

-lविकल्प के लिए एक पार्टी की योजना बनाई बनाता लॉगिन खोल। इस प्रकार, यह उपयोगकर्ता को पढ़ेगा .bash_profile। यह उपयोगकर्ता को .bashrcतब तक नहीं पढ़ेगा जब तक कि यह स्पष्ट रूप से इसके द्वारा प्रस्तुत नहीं किया जाता है .bash_profile। ऐसा इसलिए है क्योंकि गैर-संवादात्मक गोले स्वचालित रूप से नहीं पढ़ते हैं .bashrc। लेकिन आपको .bashrcएक क्रोन नौकरी की आवश्यकता नहीं होनी चाहिए क्योंकि .bashrcयह एक इंटरैक्टिव शेल के लिए उपयोगी चीजों को स्थापित करने के लिए है ।

बदलाव:

यदि बैश पेट पर है, तो एक पूर्ण पथ निर्दिष्ट करने की आवश्यकता नहीं है:

* * * * * bash -l /path/to/script arg1 arg2

एक अनुकूलन का उपयोग करके वर्तमान शेल को बदलना होगा exec:

* * * * * exec bash -l /path/to/script arg1 arg2

1

bashअलग तरह से काम करता है चाहे वह एक शेल हो या एक सामान्य प्रोग्रामिंग लैंग्वेज (जैसे perlया python)।

डिज़ाइन द्वारा ~/.bash_profile, में ~/.bashrc, आदि , सेटिंग्स उपयोगकर्ताओं के लिए चीजों को सेट करने के लिए होती हैं जब एक शेल (लॉगिन शेल, इंटरट्रैक्टिव शेल) की भूमिकाbash निभाता है । पर्यावरण के बारे में सोचें जो आपके पास एक xterm(इंटरेक्टिव शेल) या sshसत्र (लॉगिन शेल) या कंसोल (लॉगिन शेल) में है।

दूसरी ओर, सेवाओं के प्रबंधन के लिए कई लिपियों के बारे bashमें भी एक शक्तिशाली लम्बी भाषा है systemd- जिसमें काम करने की एक अलग शैली की आवश्यकता होती है। उदाहरण के लिए, जब कोई डेवलपर एक सिस्टम स्क्रिप्ट या bashप्रोग्राम लिख रहा होता है , तो वह उपयोगकर्ता को ~/.bash_profileस्वचालित रूप से स्रोत करना पसंद नहीं करेगा। यह एक सामान्य कार्यक्रम है, शेल नहीं। एक सामान्य कार्यक्रम (कार्यक्रमों सहित bash) स्वाभाविक रूप से वर्तमान कामकाजी निकासी (शेल) से सेटिंग्स प्राप्त करेगा , लेकिन उन्हें सेट नहीं किया

अगर हम एक प्रोग्राम लिखते हैं cron, तो bashयह सिर्फ लिखा जाना है bash; वास्तव में, हम इसे में लिख सकते हैं pythonया perlया किसी अन्य progamming language- तो हम करने के लिए सूत्रों का कहना है एक विकल्प हो सकता है bashकी ~/.bash_profile(पढ़ें: उपयोगकर्ता के खोल, जो सिर्फ अपने प्रोग्रामिंग भाषा के एक ही भाषा होने की सेटिंग):

[ -f /home/user/.bash_profile ] && . /home/user/.bash_profile

हालांकि, क्या होगा यदि वह विशेष उपयोगकर्ता bashअपने शेल के रूप में उपयोग नहीं करता है? वह / वह उपयोग कर सकते हैं zsh, ksh, fish, आदि तो, कि अभ्यास वास्तव में काम नहीं होगा, जब सार्वजनिक उपयोग के लिए प्रोग्राम लिखने।

तो, आप स्रोत कर सकते हैं ~/.bash_profileयदि आपको लगता है कि काम करेगा। लेकिन, यहां, यह इस बारे में नहीं है कि क्या हम किसी फ़ाइल को स्रोत बनाने में सक्षम हैं, यह इस बारे में है कि सिस्टम में चीजों को कैसे काम करना चाहिए: डिजाइन अवधारणा । संक्षेप में: हमें bash2 भूमिकाओं वाली कुछ चीज़ों को देखना चाहिए : शेल और प्रोगामिंग लैंग्वेज । तब सब कुछ समझना बहुत आसान हो जाएगा।


0

मेरे पास क्रोन से नोड एप्लिकेशन निष्पादित करते समय एक ही मुद्दा था जो एनवीएम का उपयोग करता है, ताकि बैश शेल को पढ़ने के लिए बनाया जा सके। क्रॉन से .bashrc फ़ाइल बस इंटरैक्टिव शेल विकल्प `-l के साथ बैश कमांड को एन्वोक करें।

उदाहरण के लिए: * * * * * /bin/bash -lc '/home/user/myapp.sh restart'

यदि वह काम नहीं करता है तो क्रॉस्टैब में पथ चर सेट करने का प्रयास करें

41 7 * * * /bin/bash -lc "PATH=$PATH:/home/user/.nvm/versions/node/v8.10.0/bin && /home/user/script.sh restart "

-1

इससे निपटने का मेरा तरीका यह था:

1) मेरे चरों को (के अंत में ) डालना ~/.profile:

myVarInDotProfile="someValue"

2) (मेरे (दैनिक) क्रॉन कार्यों के लिए एक बैश स्क्रिप्ट बनाना ~/cronDaily.sh) मेरे आदेशों से अधिक का दोहराव सोर्सिंग युक्त ~/.profle:

source ~/.profile
command ${myVarInDotProfile}/

3)crontab प्रतिदिन चलाने के लिए मेरी स्क्रिप्ट के निष्पादन का समय निर्धारण :

0 0 * * * bash ~/cronDaily.sh

मेरे चर को नजरअंदाज नहीं किया गया और आदेश सफलतापूर्वक चला।


कुछ लोग कह सकते हैं कि इस तरह की गहन सोर्सिंग ~/.profileसमस्याग्रस्त है। मेरे विशेष मामले में मैं यह नहीं देखता कि यह एक समस्या क्यों है, लेकिन मैं इसके लिए एक समर्पित फ़ाइल बनाने पर विचार करने की सलाह दूंगा।

सामान्य तौर पर, इसका एक बेहतर तरीका हो सकता है, लेकिन यह है कि बहुत दर्द के बाद मेरे लिए काम किया है और यह इस सिद्धांत की व्याख्या करता है कि बैश 4.3.46 के रूप में, आप किसी फ़ाइल को स्रोत नहीं कर सकते crontab

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