उपयोगकर्ता के निष्पादन के रूप में crontab निष्पादन में समान पर्यावरण चर नहीं है


20

मैंने अपना कॉन्टैब जॉब 0 2 */1 * * /aScript >aLog.log 2>&1एक 'रूट' उपयोगकर्ता के रूप में चलाया , और हालांकि मैंने पाया कि एनवी 'रूट' उपयोगकर्ता के एनवी से अलग है, और इसलिए मेरी स्क्रिप्ट के एक अलग रनटाइम व्यवहार का अनुभव कर रहा है।

एक प्रयास फिक्स rdd फ़ाइलों में निर्यात कमांड दे रहा था, लेकिन यह अभी भी नहीं दिखा! मैं खुद ही aScript में एक्सपोर्ट कमांड देता हूँ

मेरा सवाल यह है कि क्या इस समस्या से निपटने का एक बेहतर तरीका है? और env क्यों गायब है, भले ही वह उसी उपयोगकर्ता 'रूट' से हो? (मैं जड़ से 'crontab -e' चलाकर crontab को संशोधित करता है)


8
क्रोन हमेशा ज्यादातर खाली वातावरण के साथ चलता है। घर, लोगो, और शेल सेट हैं; और एक बहुत ही सीमित PATH। यदि आप सभी चर अपने आप सेट नहीं करना चाहते हैं, तो आप sourceअपनी (बैश) प्रोफाइल में सक्षम हो सकते हैं ।
साइबरबरी

2
@ cyberx86: क्यों नहीं एक उत्तर के रूप में लिखें और निरस्त करें?
user9517

2
@ मुख्य: प्रतिनिधि हमेशा स्वागत है - लेकिन कभी-कभी ऐसा लगता है कि एक पंक्ति जवाब वास्तव में प्रतिनिधि नहीं कमाता है। मैं पूरी तरह से स्वीकार करता हूं कि एक संक्षिप्त जवाब की अपनी जगह है, लेकिन मैं (शायद गलत तरीके से) टिप्पणियों का उपयोग 'आसान तरीका' के रूप में करता रहा हूं जब मैं कुछ सहायता प्रदान करना चाहता था, लेकिन एक पूर्ण, विस्तृत विवरण नहीं लिखना था (यह 1 बजे था। ..)। हालाँकि मैं आपकी सलाह लूंगा और इस पर थोड़ा विस्तार करके इसे एक उत्तर के रूप में जोड़ दूंगा।
साइबरसेक्स

@ cyberx86: गलत या सही से बेहतर एक लाइनर लगाने के लिए बेहतर है।
user9517

जवाबों:


31

क्रोन हमेशा ज्यादातर खाली वातावरण के साथ चलता है। घर, लोगो, और शेल सेट हैं; और एक बहुत ही सीमित PATH। इसलिए यह सलाह दी जाती है कि निष्पादित करने के लिए पूर्ण पथों का उपयोग करें, और क्रोन का उपयोग करते समय अपनी स्क्रिप्ट में किसी भी चर का निर्यात करें।

कई दृष्टिकोण हैं जिनका उपयोग आप अपने पर्यावरण चर को क्रोन में सेट करने के लिए कर सकते हैं, लेकिन वे सभी इसे आपकी स्क्रिप्ट में सेट करने के लिए हैं।

दृष्टिकोण 1:

अपनी स्क्रिप्ट में मैन्युअल रूप से प्रत्येक चर को सेट करें।

दृष्टिकोण 2:

अपनी प्रोफ़ाइल स्रोत:

. $HOME/.bash_profile(या . $HOME/.profile)

(आप आमतौर पर पाएंगे कि उपरोक्त फ़ाइल अन्य फ़ाइलों को स्रोत करेगी (जैसे ~ / .bashrc -> / etc / bashrc -> /etc/profile.d/*) - यदि नहीं, तो आप उन लोगों को भी स्रोत बना सकते हैं।)

दृष्टिकोण 3:

फ़ाइल के लिए अपने पर्यावरण चर को बचाएं (वांछित उपयोगकर्ता के रूप में चलाएँ):

env > /path/to/my_env.sh

फिर अपनी क्रोन स्क्रिप्ट के माध्यम से आयात करें:

env - `cat /path/to/my_env.sh` /bin/sh

दृष्टिकोण 4:

कुछ मामलों में, आप वैश्विक क्रोन चर सेट कर सकते हैं /etc/default/cron। हालांकि इसमें जोखिम का एक तत्व है, क्योंकि ये सभी क्रोन नौकरियों के लिए निर्धारित किए जाएंगे।


दृष्टिकोण 2 उन सर्वरों के लिए सबसे अच्छा है, जहां आपके पास संवेदनशील चीजें हैं जो डिस्क को एनवी vars में नहीं मारना चाहिए - पासवर्ड, एपीआई कुंजी, आदि। मेरे लिए काम करने वाले चमत्कार, इसलिए धन्यवाद।
एपी

दृष्टिकोण 4 ने मेरे लिए docker के वातावरण में काम किया जहाँ docker इंजन env var को सेट करता है। हालांकि इसके लिए काम करने के लिए, मुझे अपने ईएनवी को डॉकटर प्रविष्टि में सहेजना था। पूरा समाधान यहाँ है: github.com/rayyanqcri/swarm-scheduler
hammady

क्या आप मेरे लिए दृष्टिकोण 3 पर विस्तार से बता सकते हैं? जब मैं इसे आयात करने की कोशिश करता हूं तो मुझे मिलता हैbash: SHELL=/bin/bash: No such file
KuboMD

1

क्रोन अपना OWN शेल निर्दिष्ट उपयोग के साथ बनाता है जिसके माध्यम से वह चलेगा।

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

या

सबसे अच्छा तरीका है कि उन चर को अपनी स्क्रिप्ट में निर्यात करें।


1

RedHat CentOS में, आप स्थायी सेट करने के लिए /etc/rc.d/init.d/functions डिफ़ॉल्ट पथ सेट कर सकते हैं। प्रारंभ होने पर /etc/rc.d/crond कॉल फ़ंक्शन।


0

मैं अपने AWS पर एक समान मुद्दा था। यह इस तरह से पता लगाया

which python3

मुझे दिया /usr/bin/local/python3स्थान

और फिर

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.