मेरा क्रैस्टब क्यों काम नहीं कर रहा है, और मैं इसे कैसे परेशान कर सकता हूं?


225

यह क्रोन और कोंट्रेब का उपयोग करने के बारे में एक कैननिकल प्रश्न है

आपको यहां निर्देशित किया गया है, क्योंकि समुदाय पूरी तरह से निश्चित है कि आपके प्रश्न का उत्तर नीचे पाया जा सकता है। यदि आपके प्रश्न का उत्तर नीचे नहीं दिया गया है, तो उत्तर आपको जानकारी इकट्ठा करने में मदद करेंगे, जो समुदाय को आपकी मदद करने में मदद करेगा। यह जानकारी आपके मूल प्रश्न में संपादित की जानी चाहिए।

Ab मेरा क्रैस्टैब क्यों काम नहीं कर रहा है, इसका उत्तर और मैं इसका कैसे निवारण कर सकता हूं? 'नीचे देखा जा सकता है। यह croncrontab हाइलाइट किए गए सिस्टम को संबोधित करता है।


2
यह कारण का एक बहुत बड़ा कारण है कि क्यों क्रेस्टब AskUbuntu पर काम नहीं करता है
डैन डस्केल्सस्कू

1
@DanDascalescu एरिक की तरह लगता है और अधिक प्रतिनिधि प्राप्त करने की आवश्यकता है
मैं सबसे बेवकूफ व्यक्ति

1
मैं सिर्फ सर्वर फॉल्ट एसई में शामिल हुआ (इसलिए केवल 101 प्रतिनिधि), लेकिन इस सवाल को देना अच्छा लगेगा -1 !! क्या यह प्रश्न केवल निरस्त करने के लिए किया गया था? @IamtheMostStupidPerson पूरी तरह से आपसे सहमत हूँ ...
होलिप्रोग्रामर

इन 13 साल पुराने पैदावारों में पश्चिमी विचारधारा एक सुपरनोवा की तरह पाठ्यपुस्तक और अंधा दोनों हैं। आपके दोनों सवालों के जवाब देने के लिए: हां, मैंने इसे रिपीट के लिए किया था, और हां, एरिक को और प्रतिष्ठा पाने की जरूरत है। मुझे और कितने प्रतिनिधि चाहिए ?? अधिक। youtu.be/IaDt9T7BF38?t=262
एरिक लेसचिंस्की

जवाबों:


316

कैसे अपने सभी crontab संबंधित संकट / समस्याओं (लिनक्स) को ठीक करने के लिए


यह एक सामुदायिक विकी है , यदि आप इस उत्तर के साथ कुछ भी गलत देखते हैं या अतिरिक्त जानकारी रखते हैं तो कृपया इसे संपादित करें।


सबसे पहले, बुनियादी शब्दावली:

  • क्रोन (8) डेमॉन है जो अनुसूचित कमांड को निष्पादित करता है।
  • crontab (1) उपयोगकर्ता crontab (5) फ़ाइलों को संशोधित करने के लिए उपयोग किया जाने वाला प्रोग्राम है।
  • crontab (5) एक उपयोगकर्ता फ़ाइल है जिसमें cron (8) के लिए निर्देश हैं।

अगला, क्रोन के बारे में शिक्षा:

सिस्टम के प्रत्येक उपयोगकर्ता की अपनी crontab फ़ाइल हो सकती है। रूट और उपयोगकर्ता crontab फ़ाइलों का स्थान सिस्टम निर्भर है, लेकिन वे आम तौर पर नीचे हैं /var/spool/cron

एक सिस्टम-वाइड /etc/crontabफ़ाइल है, /etc/cron.dनिर्देशिका में crontab टुकड़े हो सकते हैं जो क्रॉन द्वारा पढ़े और कार्रवाई किए जाते हैं। कुछ लिनक्स वितरण (जैसे, रेड हैट) भी हैं /etc/cron.{hourly,daily,weekly,monthly}जो निर्देशिकाएं हैं, स्क्रिप्ट जिनके अंदर हर घंटे / दिन / सप्ताह / महीने को रूट विशेषाधिकार के साथ निष्पादित किया जाएगा।

रूट हमेशा crontab कमांड का उपयोग कर सकता है; नियमित उपयोगकर्ताओं को पहुंच प्रदान की जा सकती है या नहीं दी जा सकती है। जब आप crontab फ़ाइल को कमांड के साथ संपादित करते हैं crontab -eऔर इसे सहेजते हैं, तो crond इसे मूल वैधता के लिए जाँचता है लेकिन यह गारंटी नहीं देता कि आपकी crontab फ़ाइल सही रूप से बनाई गई है। एक फाइल है जिसे cron.denyनिर्दिष्ट किया जाएगा कि कौन से उपयोगकर्ता क्रोन का उपयोग नहीं कर सकते हैं। cron.denyफ़ाइल स्थान प्रणाली निर्भर है और नष्ट कर दिया जा सकता है जो सभी उपयोगकर्ताओं क्रॉन का उपयोग करने की अनुमति देगा।

यदि कंप्यूटर संचालित नहीं होता है या क्रोन डेमॉन नहीं चल रहा है, और कमांड चलाने के लिए दिनांक / समय बीत चुका है, तो क्रोनअप पिछले प्रश्नों को पकड़ नहीं पाएगा।

कोंट्राब विवरण, कैसे एक आदेश तैयार करने के लिए:

एक क्रॉस्टैब कमांड को एक लाइन द्वारा दर्शाया गया है। आप \कई लाइनों पर एक कमांड का विस्तार करने के लिए उपयोग नहीं कर सकते हैं। हैश ( #) चिन्ह एक टिप्पणी का प्रतिनिधित्व करता है जिसका अर्थ है कि उस रेखा पर कुछ भी क्रोन द्वारा अनदेखा किया गया है। अग्रणी व्हाट्सएप और रिक्त लाइनों को अनदेखा किया जाता है।

%अपने आदेश में प्रतिशत ( ) चिह्न का उपयोग करते समय बहुत सावधान रहें । जब तक वे बच नहीं जाते हैं, तब तक वे नए \%मामलों में परिवर्तित हो जाते हैं और पहले गैर-भागने के बाद सब कुछ %स्टड पर आपकी कमान में चला जाता है।

Crontab फ़ाइलों के लिए दो प्रारूप हैं:

  • उपयोगकर्ता crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • प्रणाली चौड़ी /etc/crontabऔर /etc/cron.dटुकड़े

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

ध्यान दें कि बाद वाले को उपयोगकर्ता-नाम की आवश्यकता होती है। कमांड को नामित उपयोगकर्ता के रूप में चलाया जाएगा।

लाइन के पहले 5 क्षेत्र उस समय (एस) का प्रतिनिधित्व करते हैं जब कमांड चलाया जाना चाहिए। आप समय विनिर्देश में संख्याओं या जहां लागू दिन / महीने के नाम का उपयोग कर सकते हैं।

  • खेतों को रिक्त स्थान या टैब द्वारा अलग किया जाता है।
  • अल्पविराम ( ,) का उपयोग किसी सूची को निर्दिष्ट करने के लिए किया जाता है जैसे 1,4,6,8 जिसका अर्थ है 1,4,6,8।
  • रंग डैश के साथ निर्दिष्ट किए गए हैं ( -) और सूचियों के साथ जोड़ा जा सकता है उदाहरण के लिए 1-3,9-12 जिसका अर्थ है 1 से 3 और फिर 9 और 12 के बीच।
  • /चरित्र एक कदम जैसे 2/5 जो 2 से शुरू होने का मतलब है तो हर 5 पेश करने (2,7,12,17,22 ...) का इस्तेमाल किया जा सकता है। वे अंत से अतीत नहीं लपेटते हैं।
  • *किसी फ़ील्ड में तारांकन ( ) उस फ़ील्ड के लिए संपूर्ण श्रेणी को दर्शाता है (उदाहरण 0-59के लिए मिनट फ़ील्ड)।
  • रंग और चरणों को संयुक्त किया जा सकता है जैसे */2कि संबंधित क्षेत्र के लिए न्यूनतम से शुरू होने का संकेत तब प्रत्येक 2 उदा 0 मिनटों के लिए (0,2 ... 58), 1 महीनों के लिए (1,3 ... 11) आदि।

क्रोन कमांड डिबगिंग

संदेशा जांचना!

डिफ़ॉल्ट रूप से क्रोन कमांड से किसी भी आउटपुट को उस उपयोगकर्ता के पास भेज देगा जो यह कमांड चला रहा है। अगर कोई आउटपुट नहीं है तो कोई मेल नहीं होगा। यदि आप क्रोन को एक अलग खाते में मेल भेजना चाहते हैं तो आप MAILTO पर्यावरण चर को crontab फ़ाइल उदा में सेट कर सकते हैं

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

आउटपुट को स्वयं कैप्चर करें

आप किसी फ़ाइल में stdout और stderr को पुनर्निर्देशित कर सकते हैं। आउटपुट कैप्चर करने का सटीक सिंटैक्स, शेल क्रोन का उपयोग करने के आधार पर भिन्न हो सकता है। यहां दो उदाहरण दिए गए हैं जो सभी आउटपुट को फ़ाइल में सहेजते हैं /tmp/mycommand.log:

1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1

लॉग को देखो

क्रोन अपने कार्यों को सिसलॉग के माध्यम से लॉग करता है, जो (आपके सेटअप के आधार पर) अक्सर /var/log/cronया पर जाते हैं /var/log/syslog

यदि आवश्यक हो तो आप उदाहरण के साथ क्रोन स्टेटमेंट को फ़िल्टर कर सकते हैं

grep CRON /var/log/syslog 

अब जब हम क्रोन की मूल बातें खत्म कर चुके हैं, जहां फाइलें हैं और उनका उपयोग कैसे किया जाए तो आइए कुछ सामान्य समस्याओं पर ध्यान दें।

जांचें कि क्रोन चल रहा है

यदि क्रोन नहीं चल रहा है, तो आपके आदेश शेड्यूल नहीं किए जाएंगे ...

ps -ef | grep cron | grep -v grep

आपको ऐसा कुछ मिलना चाहिए

root    1224   1  0 Nov16 ?    00:00:03 cron

या

root    2018   1  0 Nov14 ?    00:00:06 crond

यदि इसे पुनः आरंभ नहीं किया गया

/sbin/service cron start

या

/sbin/service crond start

अन्य विधियां हो सकती हैं; जो आपके डिस्ट्रो प्रदान करता है उसका उपयोग करें।

cron आपके आदेश को प्रतिबंधित वातावरण में चलाता है।

पर्यावरण चर उपलब्ध हैं जो बहुत सीमित होने की संभावना है। आमतौर पर, आप केवल इस तरह के रूप में परिभाषित किया कुछ चर, मिल जाएगा $LOGNAME, $HOMEऔर $PATH

विशेष रूप से नोट के PATHलिए प्रतिबंधित है /bin:/usr/bin"मेरी क्रोन स्क्रिप्ट काम नहीं करती है" का अधिकांश हिस्सा इस प्रतिबंधात्मक पथ के कारण होता है । यदि आपका आदेश किसी भिन्न स्थान पर है, तो आप इसे कुछ तरीकों से हल कर सकते हैं:

  1. अपनी आज्ञा को पूरा मार्ग प्रदान करें।

    1 2 * * * /path/to/your/command
    
  2. Crontab फ़ाइल में उपयुक्त PATH प्रदान करें

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

यदि आपके कमांड को अन्य पर्यावरण चर की आवश्यकता है, तो आप उन्हें crontab फ़ाइल में भी परिभाषित कर सकते हैं।

cron आपके कमांड को cwd == $ HOME के ​​साथ चलाता है

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

मेरे crontab में अंतिम कमांड नहीं चलती है

क्रॉन को आम तौर पर आवश्यकता होती है कि कमांड को एक नई लाइन के साथ समाप्त किया जाए। अपने crontab संपादित करें; उस पंक्ति के अंत में जाएं, जिसमें अंतिम कमांड है और एक नई लाइन डालें (एंटर दबाएं)।

Crontab प्रारूप की जाँच करें

आप / etc / crontab या /etc/cron.d और इसके विपरीत में टुकड़े के लिए एक उपयोगकर्ता crontab स्वरूपित crontab का उपयोग नहीं कर सकते हैं। एक उपयोगकर्ता स्वरूपित crontab में पंक्ति की 6 वीं स्थिति में एक उपयोगकर्ता नाम शामिल नहीं है, जबकि एक सिस्टम स्वरूपित crontab में उपयोगकर्ता नाम शामिल है और उस उपयोगकर्ता के रूप में कमांड चलाता है।

मैंने /etc/cron में एक फ़ाइल डाल दी है।

  • जाँच करें कि फ़ाइल नाम में रन-पार्ट्स देखने का एक्सटेंशन नहीं है
  • सुनिश्चित करें कि फ़ाइल ने अनुमतियाँ निष्पादित की हैं।
  • अपनी स्क्रिप्ट निष्पादित करते समय उपयोग करने के लिए सिस्टम को बताएं (उदाहरण के लिए #!/bin/shशीर्ष पर रखें)

क्रोन की तारीख संबंधित कीड़े

यदि आपकी तिथि को हाल ही में उपयोगकर्ता या सिस्टम अपडेट, टाइमज़ोन या अन्य द्वारा बदल दिया जाता है, तो क्रॉस्टैब गलत तरीके से व्यवहार करना शुरू कर देगा और विचित्र कीड़े दिखाएगा, कभी-कभी काम कर रहा है, कभी-कभी नहीं। जब यह समय इसके नीचे से बदल जाता है, तो "आप क्या चाहते हैं" करने की कोशिश करने के लिए क्रॉस्टैब का प्रयास है। घंटे बदलने के बाद "मिनट" फ़ील्ड अप्रभावी हो जाएगी। इस परिदृश्य में, केवल तारांकन स्वीकार किया जाएगा। क्रोन को फिर से शुरू करें और इंटरनेट से कनेक्ट किए बिना इसे फिर से आज़माएं (इसलिए तिथि के पास एक समय सर्वर पर रीसेट करने का मौका नहीं है)।

प्रतिशत के संकेत, फिर से

प्रतिशत संकेतों के बारे में सलाह पर जोर देने के लिए, यहां क्रोन उनके साथ क्या करता है, इसका एक उदाहरण है:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

~ 3 लाइनों वाली ~ / cron.out फ़ाइल बनाएगा

foo
bar
baz

dateकमांड का उपयोग करते समय यह विशेष रूप से घुसपैठ है । प्रतिशत संकेतों से बचना सुनिश्चित करें

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

मई 'प्रतिबंधित एएनवी' खंड में भी उल्लेख करना चाहता है कि LD_LIBRARY_PATH को साझा पुस्तकालयों को खोजने में असमर्थ होने के कारण आपके क्रोन कार्य के विफल होने पर किसी भी अतिरिक्त निर्देशिका को सेट करने की आवश्यकता हो सकती है।
डेविड जेएन

ध्यान दें कि आप भी कुछ इस तरह लिख सकते हैं: 35 1,5-23 / 2 * * * do_something के बजाय 35,1,5,7,9, .. * * * इसके अलावा यह crontab.guru आपके द्वारा की गई प्रविष्टियों का अनुवाद करता है मानव भाषा।
डेनिस नोल्टे

1
आउटपुट कैप्चर मेरे लिए काम नहीं करता है, शेल के कारण हो सकता है। मुझे लगता है कि यह अधिक पोर्टेबल है: ... /path/to/your/command >/tmp/mycommand.log 2>&1
chus

यह मेरे लिए काम किया:sudo apt-get install postfix
jmunsch

क्या क्रॉन जॉब इस बात पर भी निर्भर करता है कि फाइल कितनी भारी है? क्योंकि मैंने क्रोन के साथ अजगर में सरल हैलो वर्ल्ड चलाया, यह काम किया। लेकिन मेरा दूसरा कोड थोड़ा भारी था और सामान्य रूप से चलता है लेकिन क्रॉन के साथ यह फ़ाइल में कोई आउटपुट नहीं दे रहा है।
देवेंद्र भट

22

डेबियन लिनक्स और इसके व्युत्पन्न (उबंटू, टकसाल, आदि) में कुछ ख़ासियतें हैं जो आपके क्रॉन नौकरियों को निष्पादित करने से रोक सकती हैं; विशेष रूप से, फाइलों में /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly}करना होगा:

  • जड़ के स्वामित्व में है
  • केवल जड़ से लेखन योग्य बनो
  • समूह या अन्य उपयोगकर्ताओं द्वारा लिखने योग्य नहीं है
  • बिना किसी डॉट के एक नाम । '' या कोई अन्य विशेष चरित्र लेकिन '-' और '_'।

पिछले एक नियमित रूप से उपयोगकर्ताओं को परेशान करता है; विशेष रूप से नामित इन फ़ोल्डरों में से एक में किसी भी स्क्रिप्ट में whatever.sh, mycron.py, testfile.pl, आदि होगा नहीं क्रियान्वित किया, कभी।

मेरे अनुभव में, यह विशेष बिंदु डेबियन और डेरिवेटिव पर एक गैर-निष्पादित क्रोनजॉब का सबसे लगातार कारण है।

man cronअधिक विवरण के लिए देखें, यदि आवश्यक हो।


19

यदि आपका क्रोनॉगर काम करना बंद कर देता है, तो जांच लें कि आपका पासवर्ड समाप्त नहीं हुआ है। एक बार होने के बाद, सभी क्रोन जॉब्स बंद हो जाते हैं। नीचे दिए
गए संदेशों के /var/log/messagesसमान संदेश होंगे जो उपयोगकर्ता को प्रमाणित करने के साथ मुद्दों को दिखाते हैं:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


2
बस इसे भी मिला (त्रुटि संदेश फ़ाइल / var / log / syslog मेरे लिए)। मेरे मामले में एक DigitalOcean बॉक्स, जो समय बनाने पर, वे रूट पासवर्ड (वैकल्पिक रूप से) को दूसरे में रीसेट कर देते हैं, और जाहिर है जब तक आप वहां नहीं जाते और इसे बदलते हैं, सभी क्रॉन जॉब्स नहीं चलते हैं। ओह। फिक्स कुछ इस तरह हैsudo -u root passwd
rogerdpack

12

असामान्य और अनियमित शेड्यूल

क्रोन सभी चीजें हैं जो एक बहुत ही मूल अनुसूचक मानी जाती हैं और वाक्यविन्यास आसानी से एक व्यवस्थापक को थोड़ा और असामान्य कार्यक्रम बनाने की अनुमति नहीं देता है।

निम्नलिखित कार्य पर विचार करें जिसे आमतौर पर " commandहर 5 मिनट में चलाने के लिए " समझाया जाएगा :

*/5 * * * * /path/to/your/command

बनाम:

*/7 * * * * /path/to/your/command

जो हमेशा हर 7 मिनट में नहीं चलता हैcommand

याद रखें कि /चरित्र का उपयोग एक कदम शुरू करने के लिए किया जा सकता है, लेकिन यह चरण किसी श्रृंखला के अंत से आगे नहीं बढ़ता है। उदाहरण */7के तौर पर मिनटों से हर 7 वें मिनट 0-59यानी 0,7,14,21,28,35,42,49 से मेल खाता है । 56 लेकिन एक घंटे और अगले के बीच नहीं होगा बैचों के बीच केवल 4 मिनट , के बाद 00:56एक नई श्रृंखला पर शुरू होता है 01:00, 01:07आदि (और बैचों पर नहीं चलेंगे 01:03, 01:10, 01:17आदि)।


इसके बजाय क्या करना है?

कई बैच बनाएं

एक ही क्रोन नौकरी के बजाय, कई बैच बनाएं जो वांछित अनुसूची में संयुक्त परिणाम बनाते हैं।

उदाहरण के लिए हर 40 मिनट में एक बैच चलाने के लिए (00:00, 00:40, 01:20, 02:00 आदि) दो बैच बनाते हैं, एक वह जो दो बार भी चलाता है और दूसरा वह जो केवल विषम घंटे चलाता है:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

अपने बैचों को कम बार चलाएं

हर 7 मिनट में अपने बैच को चलाने के बजाय, जो कि कई बैचों में टूटने के लिए एक कठिन शेड्यूल है, बस इसे हर 10 मिनट के बजाय चलाएं।

अपने बैचों को अधिक बार शुरू करें (लेकिन कई बैचों को समवर्ती चलने से रोकें)

कई विषम अनुसूचियां विकसित होती हैं क्योंकि बैच रनटाइम्स में वृद्धि / उतार-चढ़ाव होता है और फिर बैचों को अतिरिक्त सुरक्षा मार्जिन के साथ थोड़ा सा शेड्यूल किया जाता है ताकि एक ही बैच के बाद के रन को ओवरलैपिंग और समवर्ती रूप से चलाने से रोका जा सके।

इसके बजाय, अलग तरह से सोचें और एक क्रोनजॉब बनाएं, जो एक पिछले रन को समाप्त नहीं होने पर इनायत से विफल हो जाएगा, लेकिन जो अन्यथा चलेगा। देखें यह प्रश्नोत्तर :

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job 

एक बार / usr / लोकल / बिन / लगातार_क्रोन_जॉब पूरा हो जाने के बाद, लगभग तुरंत एक नया रन शुरू होगा।

अपने बैचों को अधिक बार शुरू करें (लेकिन जब स्थिति सही न हो तो इनायत से बाहर निकलें)

चूंकि क्रोन सिंटैक्स सीमित है, आप बैच की नौकरी में अधिक जटिल परिस्थितियों और तर्क को खुद ही तय कर सकते हैं (या मौजूदा बैच की नौकरी के आसपास एक आवरण स्क्रिप्ट में)। इससे आप अपनी पसंदीदा स्क्रिप्टिंग भाषाओं की उन्नत क्षमताओं का उपयोग कर सकते हैं, अपने कोड पर टिप्पणी कर सकते हैं और क्रॉस्टैब प्रविष्टि में हार्ड-टू-रीड निर्माण को रोक सकते हैं।

बैश में seven-minute-jobतो कुछ इस तरह दिखेगा:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
     # The minimum interval of 7 minutes between successive batches hasn't passed yet.
    exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#### actual batch job is done, now update the time stamp
date > /tmp/lastrun
#EOF

जिसे आप हर मिनट चलाने के लिए सुरक्षित (प्रयास) कर सकते हैं:

* * * * * /path/to/your/seven-minute-job

एक अलग, लेकिन इसी तरह की समस्या हर महीने के पहले सोमवार (या दूसरे बुधवार) आदि पर चलने के लिए एक बैच शेड्यूल करने के लिए होता है, बस हर सोमवार और बाहर निकलने को चलाने के लिए बैच अनुसूची जब तिथि 1 के बीच न तो है सेंट या 7 वें और सप्ताह का दिन सोमवार नहीं है।

#!/bin/bash
# first-monday-of-the-month-housekeeping-job

# exit if today is not a Monday (and prevent locale issues by using the day number) 
if [ $(date +%u) != 1 ] ; then
  exit 0
fi

# exit if today is not the first Monday
if [ $(date +%d) -gt 7 ] ; then
  exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#EOF

जिसे आप हर सोमवार को सुरक्षित रूप से चलाने का प्रयास कर सकते हैं:

0 0 * * 1 /path/to/your/first-monday-of-the-month-housekeeping-job

क्रोन का उपयोग न करें

यदि आपकी ज़रूरतें जटिल हैं, तो आप एक अधिक उन्नत उत्पाद का उपयोग करने पर विचार कर सकते हैं जिसे जटिल अनुसूचियों (कई सर्वरों पर वितरित) को चलाने के लिए डिज़ाइन किया गया है और जो ट्रिगर, नौकरी पर निर्भरता, त्रुटि से निपटने, पुन: प्रयास करने और पुनरीक्षण निगरानी आदि का समर्थन करता है। उद्योग शब्दजाल "उद्यम" होगा " जॉब शेड्यूलिंग और / या" वर्कलोड ऑटोमेशन "।


8

पीएचपी विशेष

यदि आपके पास कुछ क्रॉन जॉब है जैसे:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

और त्रुटियों की उम्मीद के मामले में, कि उन्हें आपके पास भेजा जाएगा, लेकिन वे नहीं - यह जांचें।

डिफ़ॉल्ट रूप से PHP STDOUT में त्रुटियां नहीं भेज रहा है। @ वे https://bugs.php.net/bug.php?id=22839

इसे ठीक करने के लिए, cli`s php.ini या अपनी लाइन में (या PHP के लिए अपने बैश रैपर में) इनको जोड़ें:

  • --define display_startup_errors = 1
  • -डाइन डिस्प्ले_रियर्स = 'स्टैडर'

पहली सेटिंग आपको 'मेमोरी ऊप्स' और 2 जैसे फेटल्स की अनुमति देगी - उन सभी को STDERR पर पुनर्निर्देशित करने के लिए। जब आप अच्छी तरह से सो सकते हैं उसके बाद ही सभी को केवल लॉग के बजाय आपके रूट के मेल पर भेजा जाएगा।


2
उस त्रुटि रिपोर्ट को 2007 में PHP 5.2+ शाखाओं में जोड़े जा रहे पैच की स्थिति के साथ वापस बंद कर दिया गया था। क्या आपको यकीन है कि इसकी आवश्यकता है? मैं सिर्फ PHP 5.4 पर कोशिश की और यह ठीक काम करने लगता है। (यह अभी भी PHP 4 के लिए आवश्यक है)।
Xeoncross

@Xeoncross जवाब की तारीख देखें :)
GaRex

1
हां, यही कारण है कि 2013 में आपने जवाब दिया और '07 में टिकट वापस कर दिया।
Xeoncross

0

पूर्णता के लिए यहां से मेरा उत्तर जोड़ना , और एक अन्य संभावित सहायक संसाधन जोड़ना:

cronउपयोगकर्ता एक अलग है $PATHकी तुलना में आप कार्य करें:

उपयोगकर्ताओं को crontabप्रविष्टियों के साथ एक लगातार समस्या यह है कि वे भूल जाते हैं कि एक लॉग-इन उपयोगकर्ता के रूप में cronअलग-अलग चलता है environment। उदाहरण के लिए, एक उपयोगकर्ता अपनी $HOMEनिर्देशिका में एक प्रोग्राम या स्क्रिप्ट बनाता है , और इसे चलाने के लिए निम्न कमांड दर्ज करता है:

$ ./certbot ... 

कमांड पूरी तरह से उसकी कमांड लाइन से चलती है। उपयोगकर्ता फिर उस कमांड को अपने पास जोड़ता है crontab, लेकिन यह काम नहीं करता है:

*/10 * * * * ./certbot ....

इस मामले में विफलता का कारण यह है कि उपयोगकर्ता के लिए लॉग-इन उपयोगकर्ता के ./लिए अलग स्थान cronहै। अर्थात्, environmentअलग है! पथ का हिस्सा है environment, और यह आमतौर पर cronउपयोगकर्ता के लिए अलग होता है । इस मुद्दे को जटिल है कि है environmentके लिए cronसभी के लिए समान नहीं है * nix वितरण, और देखते हैं एक से अधिक संस्करणcron

इस विशेष समस्या का एक सरल समाधान cronउपयोगकर्ता को crontabप्रविष्टि में एक पूर्ण पथ विनिर्देश देना है :

0 22 * * * /path/to/certbot .....

cronउपयोगकर्ता क्या है environment?

कुछ उदाहरणों में, हमें अपने सिस्टम पर पूर्ण environmentविनिर्देश जानने की आवश्यकता हो सकती cronहै (या हम बस उत्सुक हो सकते हैं)। उपयोगकर्ता के environmentलिए क्या है cron, और यह हमारे से अलग कैसे है? इसके अलावा, हमें environmentकिसी अन्य cronउपयोगकर्ता के लिए जानने की आवश्यकता हो सकती है - rootउदाहरण के लिए ... rootउपयोगकर्ता का environmentउपयोग क्या है cron? इसे सीखने का एक तरीका cronहमें बताने के लिए पूछना है:

  1. अपने घर निर्देशिका में एक शेल स्क्रिप्ट बनाएं ( ~/) इस प्रकार है (या अपनी पसंद के संपादक के साथ):
$ nano ~/envtst.sh
  1. अपने सिस्टम / उपयोगकर्ता के लिए समायोजन करने के बाद, संपादक में निम्नलिखित दर्ज करें:
#!/bin/sh 
/bin/echo "env report follows for user "$USER >> /home/you/envtst.sh.out 
/usr/bin/env >> /home/you/envtst.sh.out 
/bin/echo "env report for user "$USER" concluded" >> /home/you/envtst.sh.out
/bin/echo " " >> /home/you/envtst.sh.out
  1. फ़ाइल सहेजें, संपादक से बाहर निकलें और फ़ाइल अनुमतियों को निष्पादन योग्य के रूप में सेट करें।
$ chmod a+rx ~/envtst.sh
  1. आपके द्वारा बनाई गई स्क्रिप्ट को चलाएं, और आउटपुट की समीक्षा करें /home/you/envtst.sh.out। यह आउटपुट आपके वर्तमान वातावरण को दिखाएगा जैसे $USERआप लॉग इन हैं:
$ ./envtst.sh $$ cat /home/you/envtst.sh.out
  1. अपने crontabसंपादन के लिए खोलें :
$ crontab -e -u root
  1. निम्नलिखित पंक्ति अपने नीचे दर्ज करें crontab:
* * * * *  /home/you/envtst.sh >> /home/you/envtst.sh.err 2>&1

उत्तर: आउटपुट फ़ाइल /home/you/envtst.sh.outकी एक सूची में शामिल होंगे environment"रूट क्रॉन उपयोगकर्ता के लिए"। एक बार जब आप यह जान लेंगे कि, अपने crontabप्रवेश को उसी के अनुसार समायोजित करें ।

मुझे अपनी crontabप्रविष्टि में जो शेड्यूल चाहिए वह निर्दिष्ट नहीं कर सकता :

के लिए अनुसूची प्रविष्टि crontabनिश्चित रूप से परिभाषित है man crontab, और आपको इसे पढ़ना चाहिए। हालाँकि, man crontabशेड्यूल पढ़ना और समझना दो अलग-अलग चीजें हैं। और एक शेड्यूल विनिर्देश पर परीक्षण-और-त्रुटि बहुत थकाऊ हो सकती है । सौभाग्य से, एक संसाधन है जो मदद कर सकता है: क्रॉस्टैब गुरु। । अपना शेड्यूल विनिर्देश दर्ज करें, और यह सादे अंग्रेजी भाषा में शेड्यूल की व्याख्या करेगा।

अंत में, और यहां अन्य उत्तरों में से एक के साथ निरर्थक होने का जोखिम है, यह सोचकर फंस न जाएं कि आप एकल crontabप्रविष्टि तक सीमित हैं क्योंकि आपके पास शेड्यूल करने के लिए एक काम है। आपको जितनी भी crontabज़रूरतें हैं, आपको जितनी भी ज़रूरत है, उतने प्रविष्टियों का उपयोग करने के लिए आप स्वतंत्र हैं ।

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