मैं पर्यावरण चर सेट कर सकता हूं जहां क्रॉस्टैब का उपयोग किया जाएगा?


266

मेरे पास हर घंटे एक क्रॉस्टैब चल रहा है। इसे चलाने वाले उपयोगकर्ता के पास .bash_profileउस कार्य में वातावरण परिवर्तनशील होता है, जब उपयोगकर्ता टर्मिनल से काम चलाता है, हालांकि, जाहिर है कि जब यह चलता है तो कॉन्टैब द्वारा नहीं उठाया जाता है।

मैं उन्हें में स्थापित करने की कोशिश की की है .profileऔर .bashrcलेकिन वे अभी भी उठाया पाने के लिए नहीं है। क्या किसी को पता है कि मैं पर्यावरण के वेरिएंट को कहां रख सकता हूं जो क्रॉस्टैब उठा सकता है?

जवाबों:


88

'क्रोन' एक शेल स्क्रिप्ट को चलाएं जो कमांड चलाने से पहले पर्यावरण को सेट करता है।

हमेशा।

#   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
#   Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min     Hour    Day     Month   Weekday Command
#-----------------------------------------------------------------------------
0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly

~ / बिन / क्रोन में लिपियाँ सभी एक ही लिपि, 'रनक्रॉन' के लिंक हैं, जो इस प्रकार है:

:       "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
#       Commands to be performed by Cron (no debugging options)

#       Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile

base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base

if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi

exec $cmd ${@:+"$@"}

(एक पुराने कोडिंग मानक का उपयोग करके लिखा गया है - आजकल, मैं शुरू में '#!' का उपयोग करूंगा।)

'~ / /। क्रोनफाइल' क्रोन द्वारा उपयोग के लिए मेरी प्रोफ़ाइल पर एक भिन्नता है - शोरगुल के लिए कड़ाई से गैर-संवादात्मक और कोई गूँज नहीं है। आप इसके बजाय .profile और इतने पर निष्पादित करने की व्यवस्था कर सकते हैं। (REAL_HOME सामान मेरे पर्यावरण का एक गुण है - आप दिखावा कर सकते हैं कि यह $ HOME जैसा है।)

इसलिए, यह कोड उपयुक्त वातावरण को पढ़ता है और फिर मेरे होम डायरेक्टरी से कमांड के गैर-क्रोन संस्करण को निष्पादित करता है। इसलिए, उदाहरण के लिए, मेरा 'कार्यदिवस' आदेश इस तरह दिखता है:

:       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
#       Commands to be done each weekday

# Update ICSCOPE
n.updics

'दैनिक' कमांड सरल है:

:       "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
#       Commands to be done daily

# Nothing -- most things are done on weekdays only

exit 0

246

crontab -eकमांड लाइन से चलने पर आप स्वयं crontab में पर्यावरण चर को परिभाषित कर सकते हैं ।

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

यह सुविधा केवल क्रोन के कुछ कार्यान्वयन के लिए उपलब्ध है। उबंटू और डेबियन वर्तमान में विक्सी-क्रॉन का उपयोग करते हैं जो इन्हें क्रॉस्टैब फ़ाइल (जीएनयू एमसीआरएन ) में घोषित करने की अनुमति देता है ।

Archlinux और RedHat cronie का उपयोग करते हैं जो पर्यावरण चर घोषित नहीं होने देता है और क्रोनल .log में वाक्यविन्यास त्रुटियों को फेंक देगा। प्रति-प्रविष्टि पर वर्कअराउंड किया जा सकता है:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"

58
ध्यान दें कि आप शेल के रूप में चर प्रतिस्थापन का उपयोग नहीं कर सकते हैं, इसलिए PATH = / usr / local / bin: $ PATH जैसी घोषणा को शाब्दिक रूप से व्याख्या किया जाता है।
Zac

8
मैं RedHat 4.4.7-3 और cronie-1.4.4-15.el6.x86_64 के तहत क्रॉस्टैब में पर्यावरण चर सेट करने में सक्षम था
ब्रूनो लैंग

7
अगर चर का उपयोग केवल कमांड के भीतर किया जाता है, तो आपको वेरिएबल को एक्सपोर्ट करने की आवश्यकता नहीं है, बस अपने कमांड से पहले उन्हें प्रीपेन्ड करें। "* * * * * 5 एस सो जाओ; LC_ALL = nb_NO.UTF-8 गूंज $ LC_ALL"
वूट्रान


@BrunoLange क्या आप साझा कर सकते हैं कि आपने उन्हें कैसे सेट किया?
न्यूस्कूलर

145

मुझे इस समस्या का एक और समाधान मिला:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

इस स्थिति में यह आपकी $HOME/.profileफ़ाइल में परिभाषित सभी पर्यावरण चर को चुन लेगा ।

बेशक $HOMEभी सेट नहीं है, आपको इसे अपने पूर्ण पथ से बदलना होगा $HOME


यह जवाब खोजने के लिए बहुत संघर्ष करने के बाद मेरे लिए काम किया, धन्यवाद!
vladimir montealegre

5
यह मेरे लिए तब तक काम नहीं कर रहा था जब तक मुझे एहसास नहीं हुआ कि मैंने उस अवधि को छोड़ दिया है, जो कि $ HOME से पहले था। क्या, वास्तव में, वह अवधि क्या करता है?
फ्लाईमाइक

9
अवधि "स्रोत" कमांड के बराबर है: tldp.org/LDP/abs/html/special-chars.html#DOTREF
Jeff W

@PeterLee कुछ भी उल्लेख किया आप के लिए काम किया है? मैंने इसे लिखा क्योंकि उपरोक्त समाधान मेरे लिए प्रभावी नहीं थे। यदि उपर्युक्त समाधान काम नहीं करता है, तो मुझे इसका कारण खोजने के लिए कुछ शोध करना होगा। ;-)
विशाल

3
@ विशाल वास्तव में, अब मेरे लिए काम करता है। मैं करने की कोशिश कर रहा था source ~/.bashrc, और यह पता चला कि मेरी .bashrcफाइल क्रोन जॉब के साथ विवाद की तरह है। अगर मैं .env_setup_rcकेवल एक लाइन के साथ एक बहुत ही सरल फ़ाइल का उपयोग करता हूं : export MY_ENV_VAR=my_env_valयह वास्तव में काम करता है। मेरी पोस्ट देखें: stackoverflow.com/questions/15557777/…
पीटर ली

63

/etc/environmentमेरे लिए उबंटू में सेटिंग वर्सेस भी काम किया। 12.04 तक, चर चर /etc/environmentक्रोन के लिए लोड किए गए हैं।


11
सर्वश्रेष्ठ उत्तर, बस निष्पादित करें env >> /etc/environmentऔर सभी वर्तमान एनवी संस्करण अब CRON नौकरियों में उपलब्ध हैं।
सेवजमैन

6
यह मेरे लिए बहुत अच्छा काम करता है। खासकर क्योंकि मैं एक डॉकटर कंटेनर में चल रहा हूं, इसलिए मुझे "सिस्टम वाइड" निहितार्थ के बारे में ज्यादा परवाह नहीं है।
लुकास कुम्हार

14
@ सैवेजमैन फ्यूजन बम से मक्खियों को मारने की तरह है, अप्रत्याशित व्यवहार के दांव भी ऐसा कर रहे हैं।
फ्रान मारजोआ

2
सावधान रहें: env >> /etc/environmentयदि पर्यावरण चर में से एक में कोई हैश चिन्ह है तो विफल हो जाएगा। मुझे अपने आवेदन का सबसे कठिन समय था। यह एक ऐसा पासवर्ड था जिसमें '#' लिखा था, जो उस चरण में छोटा हो रहा था।
asac

3
यह चुना हुआ उत्तर होना चाहिए। मुझे नहीं पता कि लोग अन्य उत्तरों के साथ या इस सामान के साथ env >> / etc / environment के बारे में चीजों को क्यों उलझा रहे हैं। यदि आप इन env var को सार्वभौमिक रूप से उपलब्ध कराना चाहते हैं, तो बस अच्छी तरह से एडिटिंग / एन्वायरमेंट को ब्लिंक करना: मेरे प्रयोग इस बात की पुष्टि करते हैं कि env var / etc / environment के लिए एक्सपोर्ट स्टेटमेंट crontab और उपयोगकर्ताओं के लिए भी उपलब्ध हैं। समस्या: मेरे प्रयोगों से फिर से: ऐसा प्रतीत होता है कि ये एनवी वर्जन स्वयं क्रॉस्टैब के भीतर नहीं हैं! ... अर्थात इन्हें केवल लिपियों में विस्तारित किया जाता है!
माइक कृंतक

39

यदि आप उन लिपियों को शुरू करते हैं जिन्हें आप क्रोन के माध्यम से निष्पादित कर रहे हैं:

#!/bin/bash -l

उन्हें आपके ~/.bash_profileपर्यावरण चर लेने चाहिए


4
इस उत्तर को और अधिक बढ़ाना चाहिए और बस चयनित उत्तर होना चाहिए: बहुत ही सरल और सुरुचिपूर्ण और अनगिनत कल्ज से बचा जाता है जिन्हें पूरे सिस्टम में कूदने की आवश्यकता होती है।
जेकगोल्ड

मुझे यह जवाब पसंद है +1। क्या इसका उपयोग तब किया जा सकता है जब इसे rootकोंट्राब चलाया जा रहा हो ? /home/rootमेरे सिस्टम पर कोई फोल्डर नहीं है और इसलिए मैं यह नहीं देखता कि यह कैसे काम करेगा root। विचार?
सीमस

स्क्रिप्ट में ही। जिसे आप सामान्य रूप से क्रोन के साथ चलाते हैं।
breizhmg

@ इस उदाहरण को देखें , क्लासिक एग्जीक्यूटेबल फाइल (chmod 777) का उपयोग #!/bin/bash। यहाँ जादू जोड़ना है-l
पीटर क्रस

22

@Carestad उदाहरण पर विस्तार, जो मुझे आसान लगता है, स्क्रिप्ट को क्रोन के साथ चलाना और स्क्रिप्ट में पर्यावरण है।

Crontab -e फ़ाइल में:

SHELL=/bin/bash

*/1 * * * * $HOME/cron_job.sh

Cron_job.sh फ़ाइल में:

#!/bin/bash
source $HOME/.bash_profile
some_other_cmd

.Bash_profile के स्रोत के बाद की कोई भी कमांड आपके वातावरण को मान जाएगी जैसे आपने लॉग इन किया है।


16

मेरे लिए मुझे php एप्लिकेशन के लिए पर्यावरण चर सेट करना पड़ा। मैंने अपने क्रॉस्टैब में निम्न कोड जोड़कर इसे फिर से व्यवस्थित किया।

$ sudo  crontab -e

crontab:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

और अंदर doSomethingWonderful.php मैं पर्यावरण मूल्य प्राप्त कर सकता है:

<?php     
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"

आशा है कि ये आपकी मदद करेगा!


यह मेरे लिए काम नहीं किया। पर्यावरण चर उस लिपि में उपलब्ध नहीं था, जिसे क्रॉस्टैब के अंदर लगाया गया था।
निखिल

12

आप जो कुछ भी सेट crontabकरते हैं, वह क्रोनोग्रफ़ में उपलब्ध होगा, दोनों लिपियों में सीधे और चर का उपयोग करते हुए।

क्रोनजोब की परिभाषा में उनका उपयोग करें

आप कॉन्फ़िगर कर सकते हैं crontabताकि यह चर सेट करे जो फिर क्रोनजोब का उपयोग कर सकता है:

$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello

अब फाइल /tmp/helloकुछ इस तरह दिखाती है:

$ cat /tmp/hello 
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016

क्रोनजोब द्वारा संचालित स्क्रिप्ट में उनका उपयोग करें

आप इसे कॉन्फ़िगर कर सकते हैं crontabताकि यह चर सेट करे जो तब स्क्रिप्ट का उपयोग कर सकता है:

$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh

और कहते हैं कि स्क्रिप्ट /tmp/myscript.shइस तरह है:

echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res

यह एक फ़ाइल /tmp/myoutput.resदिखाता है:

$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...

7

@Robert Brisita पर विस्तार करना अभी विस्तार किया है, भले ही आप स्क्रिप्ट में प्रोफ़ाइल के सभी चर सेट नहीं करना चाहते हैं, आप स्क्रिप्ट के शीर्ष पर निर्यात करने के लिए चर का चयन कर सकते हैं।

Crontab -e फ़ाइल में:

SHELL=/bin/bash

*/1 * * * * /Path/to/script/script.sh

स्क्रिप्ट में

#!/bin/bash
export JAVA_HOME=/path/to/jdk

some-other-command

7

के बजाय

0  *  *  *  *  sh /my/script.sh

बाश -एल -सी का उपयोग करें

0  *  *  *  *  bash -l -c 'sh /my/script.sh'

1
क्यों है सिर्फ फ़ाइल के शीर्ष पर बैश घोषणा के बजाय यह करने के -lइस तरह: #!/bin/bash -l? यह अन्य उत्तर सरल और सुरुचिपूर्ण है।
जेकगोल्ड

1
क्या होगा यदि मुझे एक पर्ल / पायथन / रूबी स्क्रिप्ट को चलाने की आवश्यकता है जो बैश नहीं है? मैं अजगर स्क्रिप्ट के शीर्ष पर #! / Bin / bash -l नहीं जोड़ सकता।
इल्या खारलामोव

"क्या होगा अगर मुझे एक पर्ल / पायथन / रूबी स्क्रिप्ट चलाने की आवश्यकता है जो बैश नहीं है?" काफी उचित। लेकिन मेरे दिमाग में आप एक साधारण बैश स्क्रिप्ट रैपर लिख सकते थे, जिसे तब पायथन स्क्रिप्ट कहते थे। मैं PHP स्क्रिप्ट के लिए एक समान काम करता हूं। कारण यह है कि प्रक्रिया लॉकिंग बैश में बहुत बेहतर और विश्वसनीय है, लेकिन बैश स्क्रिप्टिंग अभी भी सिरदर्द है। इसलिए मैंने जटिल सामान के लिए PHP में सामान लिखा और बैश को बाकी को संभालने दिया।
जेकगोल्ड

3

मैं Oh-my-zshअपने मैकबुक में उपयोग कर रहा हूं, इसलिए मैंने कई चीजों की कोशिश की है कि कोंट्राब टास्क को पूरा किया जाए, लेकिन आखिरकार, मेरे हल .zshrcको चलाने से पहले ही मेरा हल चल रहा था ।

*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js

यह कार्य प्रत्येक 30 मिनट चलता है और .zshrcमेरी नोड कमांड को निष्पादित करने के लिए प्रोफ़ाइल का उपयोग करता है ।

$HOMEVar से पहले डॉट का उपयोग करना न भूलें ।


2

एक और तरीका - इस उत्तर से प्रेरित है - चर "इंजेक्ट" करने के लिए निम्नलिखित (fcron उदाहरण) है:

%daily 00 12 \
    set -a; \
    . /path/to/file/containing/vars; \
    set +a; \
    /path/to/script/using/vars

से help set:

-एक मार्क चर जो संशोधित या निर्यात के लिए बनाए गए हैं।

के बजाय + का उपयोग करना - इन झंडों को बंद करने का कारण बनता है।

तो बीच में सब कुछ set -और set +निर्यात हो जाता है envऔर फिर अन्य लिपियों के लिए उपलब्ध है, आदि बिना setचर का उपयोग किए बिना खट्टे हो जाते हैं लेकिन setकेवल रहते हैं ।

इसके अलावा, जब किसी प्रोग्राम को चलाने के लिए एक गैर-रूट खाते की आवश्यकता होती है, तो चर भी पास करना उपयोगी होता है, लेकिन आपको उस अन्य वातावरण में कुछ चर की आवश्यकता होगी। नीचे ई-मेल हेडर को फॉर्मेट करने के लिए nullmailer vars में एक उदाहरण दिया जा रहा है:

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck

2

मैंने अधिकतर प्रदान किए गए समाधानों की कोशिश की, लेकिन पहले कुछ भी काम नहीं किया। हालांकि, यह पता चला है कि यह समाधान नहीं था जो काम करने में विफल रहा। जाहिर है, मेरी ~/.bashrcफ़ाइल कोड के निम्नलिखित ब्लॉक से शुरू होती है:

case $- in
    *i*) ;;
    *) return;;
esac

यह मूल रूप से एक है case statementजो मौजूदा शेल में विकल्पों के वर्तमान सेट की जांच करता है ताकि यह निर्धारित किया जा सके कि शेल संवादात्मक रूप से चल रहा है। यदि शेल संवादात्मक रूप से चल रहा है, तो यह ~/.bashrcफ़ाइल को सोर्स करने के लिए आगे बढ़ता है । हालाँकि, द्वारा निर्दिष्ट शेल में cron, $-चर में वह iमान नहीं होता है जो अन्तरक्रियाशीलता को इंगित करता है। इसलिए, ~/.bashrcफ़ाइल कभी भी पूरी तरह से सॉर्ट नहीं होती है। नतीजतन, पर्यावरण चर कभी सेट नहीं हुआ। यदि ऐसा होना आपका मुद्दा है, तो कोड के ब्लॉक को निम्नानुसार टिप्पणी करने के लिए स्वतंत्र महसूस करें और फिर से प्रयास करें:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

मुझे आशा है कि यह उपयोगी है


0

आप envपर्यावरण चर को इंजेक्ट करने के साथ अपनी कमांड को भी पूर्व निर्धारित कर सकते हैं जैसे:

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