सवाल क्यों crontab स्क्रिप्ट काम नहीं कर रहे हैं?


अक्सर, crontab स्क्रिप्ट को अनुसूची या अपेक्षित के रूप में निष्पादित नहीं किया जाता है। इसके लिए कई कारण हैं:

  1. गलत crontab नोटेशन
  2. अनुमति समस्या
  3. पर्यावरण चर

इस समुदाय विकी का उद्देश्य शीर्ष कारणों को एकत्र करना है crontab स्क्रिप्ट को उम्मीद के रूप में निष्पादित नहीं किया जा रहा है। प्रत्येक कारण को एक अलग उत्तर में लिखें।

कृपया प्रति जवाब एक कारण शामिल करें - इसके बारे में विवरण क्यों निष्पादित नहीं किया गया है - और उस कारण के लिए ठीक करें (एसएस)।

कृपया केवल क्रॉन-विशिष्ट समस्याएं लिखें, उदा। आदेश जो कि खोल से अपेक्षित निष्पादित करते हैं लेकिन क्रॉन द्वारा गलती से निष्पादित करते हैं।


455


मूल


आपको बंद करना होगा crontab -e क्रॉन को प्रभावित करने के लिए। उदाहरण के लिए vim का उपयोग करके मैं फ़ाइल संपादित और उपयोग करता हूं :w इसे लिखने के लिए, लेकिन जब तक मैं छोड़ नहीं जाता तब तक नौकरी को क्रॉन में जोड़ा नहीं जाता है। तो मैं तब तक नौकरी नहीं देखूंगा जब तक मैं नहीं :q भी। - DutGRIFF
मुझे लगता है कि क्रॉन डीबग करने का सबसे अच्छा तरीका syslog की जांच करना और समस्याओं को ढूंढना है। - Suneel Kumar
मेरे मामले में - ईमेल मेरे स्पैम फ़ोल्डर में जा रहा था, इसलिए ..... डिबगिंग पर घंटों खर्च करने से पहले जांचें: डी - almaruf
विद्युत आबादी - Josef Klimuk


जवाब:


विभिन्न पर्यावरण

क्रॉन आपकी नौकरियों में पर्यावरण चर के न्यूनतम सेट को पास करता है। अंतर देखने के लिए, इस तरह एक डमी नौकरी जोड़ें:

* * * * * env> /tmp/env.output

के लिए इंतजार /tmp/env.output बनने के लिए, फिर नौकरी को फिर से हटा दें। अब की सामग्री की तुलना करें /tmp/env.output के उत्पादन के साथ env अपने नियमित टर्मिनल में भागो।

यहां एक आम "गोचाचा" है PATH पर्यावरण चर अलग है। शायद आपकी क्रॉन स्क्रिप्ट कमांड का उपयोग करती है somecommand में पाया /opt/someApp/bin, जिसे आपने जोड़ा है PATH में /etc/environment? क्रॉन अनदेखा करता है PATH उस फ़ाइल से, तो चल रहा है somecommand क्रॉन के साथ चलने पर आपकी स्क्रिप्ट से असफल हो जाएगा, लेकिन टर्मिनल में चलने पर काम करें। यह ध्यान देने योग्य है कि से चर /etc/environment क्रॉन नौकरियों पर पारित किया जाएगा, न केवल चर क्रॉन विशेष रूप से खुद को सेट करता है, जैसे कि PATH

इसके आस-पास पहुंचने के लिए, बस अपना खुद का सेट करें PATH लिपि के शीर्ष पर चर। जैसे

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

कुछ इसके बजाय सभी आदेशों के लिए पूर्ण पथ का उपयोग करना पसंद करते हैं। मैं इसके खिलाफ सिफारिश करता हूं। विचार करें कि क्या होता है यदि आप अपनी स्क्रिप्ट को किसी अन्य सिस्टम पर चलाना चाहते हैं, और उस सिस्टम पर, आदेश अंदर है /opt/someAppv2.2/bin बजाय। आपको पूरी स्क्रिप्ट को बदलना होगा /opt/someApp/bin साथ में /opt/someAppv2.2/bin स्क्रिप्ट की पहली पंक्ति पर बस एक छोटा संपादन करने के बजाय।

आप क्रॉन्टाब फ़ाइल में पाथ वैरिएबल भी सेट कर सकते हैं, जो सभी क्रॉन नौकरियों पर लागू होगा। जैसे

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root

431



मुझे लगता है कि मैं बस इसके लिए गिर गया, और अंत में नई लाइन ... डबल whammy। - WernerCD
के लिए +1 env, मैं पूरी तरह से उस आदेश के बारे में भूल गया था और सोचा था कि पथ काम कर रहा था। यह वास्तव में मेरे मामले में थोड़ा अलग था। - Izkata
@pbr अगर ऐसी निर्देशिकाएं दूसरों के लिए लिखने योग्य हैं, तो सिस्टम पहले ही समझौता कर चुका है। - geirha
@pbr एक sysadmin अनजाने में रूट फाइल सिस्टम को हटा सकता है। आप मूर्खतापूर्ण गलतियों को सिसडमिन के खिलाफ नहीं रोक सकते हैं। यदि आप एक दुभाषिया का एक नया संस्करण स्थापित करते हैं जो पिछड़ा संगत नहीं है, तो मैं ब्रेकेज की परवाह करता हूं। इसे संभालने का सौदा तरीका इसे एक अलग कमांड के रूप में स्थापित करना है। जैसे आपके पास अजगर संस्करण 2.x है और पाइथन 3 स्थापित करें, आप इसे पायथन 3 के रूप में स्थापित करें, पायथन नहीं। और के रूप में / opt / someApp / bin के लिए, पृथ्वी पर क्यों इसे सौम्य अनुमति / स्वामित्व नहीं होगा? कोई भी सीन व्यवस्थापक सिस्टम फ़ाइलों पर सौ अनुमति / स्वामित्व सुनिश्चित करेगा। - geirha
@pbr ऐसा लगता है कि हम हमेशा के लिए जा सकते हैं, हाँ। मैं अभी भी यह देखने में असफल रहा कि हालांकि पीएटीएच का उपयोग करना क्यों बुरा विचार है। यदि आप चर्चा के लिए उपयुक्त माध्यम में इस पर आगे चर्चा करना चाहते हैं, तो आप मुझे irubfreenode.net पर अन्य चैनलों के बीच #ubuntu और #bash में पाएंगे - geirha


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

इस मुद्दे के लिए मैन पेजों में प्रासंगिक अनुभाग नीचे दिया गया है (man crontab फिर अंत तक छोड़ें):

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

291



यह एक शोस्टॉपर है, यह कैसे क्रॉन के इतने सालों में तय नहीं किया गया है? - Capi Etheriel
Vixie क्रॉन में तय किया जाता है: man crontab उबंटू 10.10 पर कहते हैं, "क्रॉन की आवश्यकता है कि एक क्रॉन्टाब में प्रत्येक प्रविष्टि एक न्यूलाइन चरित्र में समाप्त हो। अगर क्रॉन्टाब में आखिरी प्रविष्टि में नई लाइन लापता है, तो क्रॉन क्रॉन्टाब (कम से कम आंशिक रूप से) टूटा और इसे स्थापित करने से इंकार कर देगा।" (और अंत में दिनांक 1 9 अप्रैल 2010 है।) - Marius Gedminas
@barraponto यह वास्तव में नए पाठ संपादकों में एक बग है। "न्यूलाइन" चरित्र एक माना जाता है लाइन समाप्ति चरित्र, इसलिए एक पाठ फ़ाइल में अंतिम पंक्ति को एक न्यूलाइन वर्ण में समाप्त होना चाहिए जो संपादक में नहीं दिखाया जाता है। वी और विम चरित्र का सही ढंग से उपयोग करते हैं, और नए संपादकों ने अपने अजीब व्यवहार शुरू करने से पहले क्रॉन बनाया गया था ... इसलिए इसे एक खाली रेखा को सहेजना और शामिल करना। - Izkata
यदि आप क्रोंटैब का उपयोग कर संपादित करते हैं crontab -e यह सहेजने से पहले फ़ाइल की सिंटैक्स की जांच करेगा, जिसमें न्यूलाइन के लिए चेक भी शामिल है। - Tom Harrison Jr
मैन पेज के अनुसार @ चान-होसुह, क्रॉन की आवश्यकता है कि एक क्रॉन्टाब में प्रत्येक प्रविष्टि एक न्यूलाइन चरित्र में समाप्त हो। अगर क्रॉन्टाब में आखिरी प्रविष्टि नई लाइन लापता है, तो क्रॉन क्रोंटैब (कम से कम आंशिक रूप से) टूटा और इनकार करने पर विचार करेगा इसे स्थापित करो।" संपादन करते समय क्रांतिकैब को सहेजते समय यह व्यवहार लागू किया जाएगा -e विकल्प, और संपादक से स्वतंत्र है। - Tom Harrison Jr


क्रोन डिमन नहीं चल रहा है। मैं वास्तव में कुछ महीने पहले इस के साथ खराब हो गया था।

प्रकार:

pgrep cron 

यदि आपको कोई संख्या दिखाई नहीं देती है, तो क्रॉन नहीं चल रहा है। sudo /etc/init.d/cron start क्रॉन शुरू करने के लिए इस्तेमाल किया जा सकता है।

संपादित करें: /etc/init.d के माध्यम से init स्क्रिप्ट का आविष्कार करने की बजाय, सेवा का उपयोग करें उपयोगिता, उदा।

sudo service cron start

125



मुझे pgrep दिखाने के लिए धन्यवाद। मैं ps -ef कर रहा था grep foo - ripper234
आप भी इस्तेमाल कर सकते हैं pidof cron जो अन्य अनुप्रयोगों के परिणाम निकाल देगा जिनके पास क्रॉनबैब जैसे 'क्रॉन' शब्द भी होंगे। - Pithikos
अजीब, ये सब मुझे क्रॉन दिखाने के लिए कुछ भी नहीं देते हैं, लेकिन अगर मैं दौड़ता हूं sudo service cron start मुझे मिला start: Job is already running: cron - Colleen
service crond start अगर इसके केंद्र / आरएचईएल - Srihari Karanth


लिपि में फ़ाइल नाम cron.d/, cron.daily/, cron.hourly/, आदि, डॉट नहीं होना चाहिए (.), अन्यथा रन-पार्ट्स उन्हें छोड़ देंगे।

रन-पार्ट्स देखें (8):

   If neither the --lsbsysinit option nor the --regex option is given then
   the names must consist entirely of upper and lower case  letters,  dig‐
   its, underscores, and hyphens.

   If  the  --lsbsysinit  option  is given, then the names must not end in
   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
   one  or more of the following namespaces: the LANANA-assigned namespace
   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
   (^[a-zA-Z0-9_-]+$).

तो, यदि आपके पास एक क्रॉन स्क्रिप्ट है backup.sh, analyze-logs.pl में cron.daily/ निर्देशिका, आप एक्सटेंशन नामों को हटाने के लिए सबसे अच्छा होगा।


83



यह एक सुविधा नहीं है - यह मेरी mycript के बगल में चलने से myscript.backup या myscript.original या myscript.rpm-new जैसी चीजें रखती है। - pbr
@pbr: समझ में आता है। कम से कम यह डीबगिंग के लिए उपयोगी होगा अगर run-parts --test (या एक और काल्पनिक विकल्प जैसे --debug कारणों को छोड़कर फाइलों को आउटपुट करेगा। - Rabarberski
यदि यह एक विशेषता है, तो यह अच्छा नहीं है :( बहुत से लोग फ़ाइल नाम में डॉट का उपयोग करते हैं (backup.sh सबसे आम है)। अगर आप निष्पादन को रोकने के लिए एक स्क्रिप्ट चाहते हैं, तो सबसे तार्किक विधि होगी इसे "cron.d" निर्देशिका से हटा दें। - MatuDuke
यह एक बुरी विशेषता है कि यह प्रभावी रूप से एक बग है। एक विशेष अंत (जैसे ".list" या ".cron" या कुछ) की आवश्यकता होती है, यदि लोग यह सुनिश्चित करना चाहते हैं कि चीजें केवल तभी चलें जब इरादा हो। मनमाने ढंग से डॉट को ".bak" या ".temp" या जो भी हो, के लिए संभावित विभाजक के रूप में चुनना, पूरी तरह से अप्रत्याशित है जिस तरह से यह लोगों को अनुमानित रूप से भ्रमित करेगा। ".Sh", और ".pl" जैसे वैध अंत दशकों तक व्यापक रूप से उपयोग में हैं। हालांकि, बहुत से लोग डॉट के बजाय "_bak" या "_temp" या "-bak" का उपयोग करते हैं। यह एक भयानक डिजाइन पसंद है; यह सबसे अच्छा डिजाइन डिज़ाइन है। - Teekin


कई वातावरण में cron का उपयोग कर आदेश निष्पादित करता है sh, जबकि कई लोग मानते हैं कि इसका उपयोग होगा bash

असफल आदेश के लिए परीक्षण या इसे ठीक करने के सुझाव:

  • कमांड को चलाने का प्रयास करें sh यह देखने के लिए कि यह काम करता है
  • यह सुनिश्चित करने के लिए कि यह बैश में चलाया जाता है, एक बैश सबहेल में कमांड को दबाएं:
    bash -c "mybashcommand"
  • अपने crontab के शीर्ष पर खोल सेट करके क्रैश में सभी आदेशों को चलाने के लिए क्रॉन को बताएं:
    SHELL=/bin/bash
  • यदि आदेश एक स्क्रिप्ट है, तो सुनिश्चित करें कि स्क्रिप्ट में शेबैंग है:
    #!/bin/bash

55



बैश सुझाव मेरे क्रॉन के साथ बहुत उपयोगी, निश्चित मुद्दा है। - Maxim Galushka
इसने मुझे केवल 1 घंटे की झुकाव / समस्या निवारण का कारण बना दिया। यदि आप इस मुद्दे से अवगत नहीं हैं, तो भी अधिक परेशान है, यदि आप विशिष्ट शेल हैं तो स्क्रिप्ट मैन्युअल रूप से ठीक हो जाएगी bash, लेकिन साथ नहीं cron। धन्यवाद! - Hendy
बहुत समय पहले मैं कुछ संबंधित में भाग गया: आदेश source बाश में है लेकिन श नहीं है। क्रॉन / श में, एक अवधि का उपयोग करें: . envfile बजाय source envfile। - kungphu


मुझे समय क्षेत्र के साथ कुछ समस्याएं थीं। क्रॉन ताजा स्थापना समय क्षेत्र के साथ चल रहा था। समाधान क्रॉन को पुनरारंभ करना था:

sudo service cron restart

34



हां, किसी सिस्टम पर टाइमज़ोन को बदलने के बाद, किसी को भी उस सेवा को पुनरारंभ करना होगा जो इस बात की परवाह करता है कि यह किस समय है, या रीबूट करें। मैं यह सुनिश्चित करने के लिए रीबूट पसंद करता हूं कि मैंने सब कुछ पकड़ा है। - pbr
हे भगवान के लिए, इस पर घंटों की मौत हो गई। कोशिश की गई सेवा के बाद पुनरारंभ करें * * * * * touch /tmp/cronworks कुछ नहीं किया, अभी तक है RELOAD cronlog पर। - НЛО


यदि आपके crontab कमांड में है % इसमें प्रतीक, क्रॉन इसे समझने की कोशिश करता है। तो अगर आप किसी के साथ किसी भी कमांड का उपयोग कर रहे थे % इसमें (जैसे डेट कमांड के प्रारूप विनिर्देश) आपको इसे से बचने की आवश्यकता होगी।

वह और अन्य अच्छे गठिया यहां:
http://www.pantz.org/software/cron/croninfo.html


29



यही कारण है कि पिछले सप्ताह के लिए मेरी क्रॉन नौकरी विफल रही है। अंत में पता चला कि मेरी तिथि में बचने वाला चरित्र नहीं था (किसी भी अन्य लोगों के लिए बैकस्लैश जो बचने वाले चरित्र की तलाश में है)। वाह! - Valien
यह भी देखें मैं कैसे निष्पादित कर सकता हूं date एक क्रॉन टैब नौकरी के अंदर? - Jared Beck
यह मुझे भी थोड़ा सा है। धन्यवाद! - stefansundin


स्क्रिप्ट के लिए पूर्ण पथ का उपयोग किया जाना चाहिए:

उदाहरण के लिए, /bin/grep इसके बजाय इस्तेमाल किया जाना चाहिए grep:

# m h  dom mon dow   command
0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors

के बजाय:

# m h  dom mon dow   command
0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors

यह विशेष रूप से मुश्किल है, क्योंकि शेल से निष्पादित होने पर वही आदेश काम करेगा। कारण यह है कि cron वही नहीं है PATH उपयोगकर्ता के रूप में पर्यावरण परिवर्तनीय।


28



जिरा जवाब देखें, आप क्रॉन के पथ को परिभाषित कर सकते हैं (आवश्यक) - Capi Etheriel
Bzzt। आपको पथ को परिभाषित करने की आवश्यकता नहीं है - पूर्ण पथ का उपयोग करके यहां सबसे अच्छा अभ्यास है। "क्योंकि किसी निष्पादन योग्य किसी अन्य कंप्यूटर पर कहीं और हो सकता है" ट्रम्प नहीं करता है "मैं चाहता हूं कि यह वास्तव में इस कार्यक्रम को चलाने के लिए और किसी अन्य व्यक्ति को मेरे मूल कार्यक्रम के सामने पथ में नहीं डाला जाए" - pbr
हाँ यह मेरे लिए था, क्रॉन के बाहर मैं सीधे आदेश चला सकता था, क्रॉन के अंदर इसे पूरी तरह से जरूरी था /usr/bin/whatever पथ - Anentropic