रूट क्रोन जॉब को ठीक से कैसे सेट करें


36

मैंने एक बैश स्क्रिप्ट को रूट के रूप में चलाने के लिए एक रूट क्रॉन जॉब स्थापित करने की कोशिश की, मिनट को 7,37, हर घंटे, महीने के हर दिन, हर महीने चलाने के लिए। यह लिपि में स्थित /usr/binऔर नामित है tunlrupdate.sh। यह डीएनएस टुनलर को अपडेट करता है।

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

यह बैश स्क्रिप्ट यहां उपलब्ध है

जब स्क्रिप्ट लिखी जाती है, तो लॉग में स्थित क्या हो रहा है /var/log/tunlr.log

इस रूट क्रोन जॉब को जोड़ने के लिए मैंने रूट के क्रॉस्टैब के लिए मानक का उपयोग किया

sudo crontab -e

और अंत में इन 2 लाइनों को सम्मिलित किया। मुझे उम्मीद है कि स्क्रिप्ट को जड़ के रूप में चलाने के लिए क्रोन होगा।

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

बाद में एक कमांड sudo crontab -lने पुष्टि की कि क्रॉन जॉब डाला गया है।

मैंने उबंटू को रीबूट किया और लॉग फ़ाइल में जाँच रहा था कि क्या क्रोन नौकरी ठीक से शुरू की गई थी। हालाँकि, लॉगफ़ाइल में कुछ भी नहीं है /var/log/tunlr.logजिसका अर्थ है कि काम कभी भी सफलतापूर्वक लॉन्च नहीं किया गया था।

मैंने जाँच की कि अगर मैं कमांड लाइन से स्क्रिप्ट चलाता हूँ

sudo /usr/bin/tunlrupdate.sh

फिर लॉगफाइल को तदनुसार अपडेट किया जाता है।

मेरे सिस्टम में यह क्रॉन जॉब योजना के अनुसार क्यों नहीं चल रहा है?

अद्यतन 1: सभी प्रस्तावित समाधान अब तक काम नहीं करते हैं। मैं सिस्टम लॉग को सूचीबद्ध करने के लिए एक सीएलआई के लिए ओली का धन्यवाद करता हूं sudo grep CRON /var/log/syslog। हालाँकि मुझे एक CRON त्रुटि मिली

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

सुझाए गए पथ = स्क्रिप्ट में कार्यों के लिए जड़ से पूर्ण पथ का सम्मिलन और उपयोग या इसके बिना यहां सुझाए गए समाधान। मुझे अभी भी यह त्रुटि मिलती है।

कुछ खोज के बाद मैंने फ़ाइल में त्रुटि /usr/lib/php5/maxlifetimeबताई है जैसा कि यहाँ बताया गया है :Change #!/bin/sh -e --> #!/bin/sh -x

फिर मेरे सिस्टम में CRON त्रुटि लॉग को सूचीबद्ध करना

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

मुझे अभी भी बैश स्क्रिप्ट का निष्पादन नहीं मिला है। इस बार लॉग में कोई त्रुटि नहीं दिखाई गई है। यह सुनिश्चित करने के लिए कि यह स्क्रिप्ट की सामग्री नहीं थी, मैंने स्क्रिप्ट को निम्न 3 लाइनों में बदल दिया:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

मुझे अभी भी क्रोन की नौकरी नहीं मिली है। लॉग फ़ाइल में कुछ भी नहीं लिखा है। तो क्या एक खाली लिपि भी क्रोन में नहीं चलेगी? मुझे नहीं मिला। मुझे पता है कि इन 2 लाइनों के लिए कम एक स्क्रिप्ट की कोशिश कर रहा हूँ:

#!/bin/bash
exit 0

और अभी भी वही त्रुटि लॉग है। क्रोन स्क्रिप्ट के माध्यम से नहीं जाता है ...


यदि आप चाहते हैं कि यह एक "रूट" क्रोनजॉब हो तो आपको रूट होना होगा फिर आप क्रॉन्स्टैब टाइप करें। इसके अलावा, आपको बस रूट (कंसोल प्रकार "सु रूट") के रूप में लॉगिन करना होगा और फिर crontab -e (इस मामले में sudo की आवश्यकता नहीं है)।
वोल्फगैंग

कुंआ। मुझे आपके उत्तर की बात दिखाई नहीं दे रही है? टाइपिंग $ sudo crontab -e ने $ sudo crontab -l द्वारा रिपोर्ट की गई थी, यानी नई नौकरी का वर्णन करने वाली लाइन को रूट के cron में जोड़ा गया है। जैसे कि नौकरी उपयोगकर्ता cron में मौजूद नहीं है जैसे $ crontab -l यह नहीं दिखाती है कि कोई cron जॉब यहां जोड़ी गई थी।
एंटोनियो

@ वोल्फगैंगवोग्ल ने "सुडो" का इस्तेमाल किया जो उम्मीद के मुताबिक काम करता है।
एलेक्सिस विल्के

जवाबों:


68

यदि आप एक स्क्रिप्ट को सामान्य उपयोगकर्ता के रूप में चलाना चाहते हैं :

crontab -e

और लाइन जोड़ें:

07,37 * * * * /usr/bin/tunlrupdate.sh

यदि आप अपनी स्क्रिप्ट को रूट के रूप में चलाना चाहते हैं :

sudo crontab -e

और एक ही पंक्ति जोड़ें:

07,37 * * * * /usr/bin/tunlrupdate.sh

@NineCattoRules यदि आप आउटपुट नहीं छोड़ते हैं, तो आप क्या देखते हैं?
एंजेलो फुच्स

@AngeloFuchs पुरानी टिप्पणी ... निश्चित रूप से मैंने उस कमांड को रूट ( sudo crontab -eबजाय crontab -e) के रूप में आज़माया । या कुछ और, वैसे भी यह काम करता है
NineCattoRules

10

ठीक है, काम कर रहे समाधान पर। Syslog में मैंने दोहराव और पेचीदा देखा:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

ऐसा लगता है कि जड़ को सीएमडी के रूप में मान्यता नहीं दी गई थी। जैसा कि मैंने पहले ही रूट के क्रोन का उपयोग करके किया था $ sudo /usr/bin/tunlrupdate.sh। तब मैंने मूल स्क्रिप्ट के साथ प्रयास किया (तिथि UNIX cmd में एक गलती के लिए सही किया गया:% m जो महीना है वह मिनट के लिए उपयोग किया गया था जो% M) निम्नलिखित है (जो क्रोन लाइन से रूट को हटाता है):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

यह अंतिम समाधान निकला। [हालांकि मैंने साहित्य के स्कोर को क्रोन लाइन में रूट के साथ गलत लाइन बताते हुए पाया। वह एक ग़लती थी]।


अच्छी बात है ओली। इस पर मैं आपसे सहमत हूं। संदर्भ के लिए उपयोगकर्ता crontab / var / spool / cron / crontabs / user-name में या रूट / var / spool / cron / crontabs / रूट के लिए संग्रहीत किया जाता है। इस पृष्ठ को देखें askubuntu.com/questions/216692/where-is-the-user-crontab-stored जिसमें पहले से मौजूद फ़ोल्डर है और उपयोगकर्ता का नाम देता है।
एंटोनियो

ठीक है, आपको उस जानकारी की आवश्यकता नहीं होनी चाहिए, क्योंकि आपको केवल crontabकमांड के साथ कॉस्ट्रैब फाइल को एडिट करना चाहिए (कोट्रैब फाइल को छोड़कर /etc)।
ओली

1
@Antonio उपयोगकर्ता नाम फ़ील्ड के साथ स्कोर केवल /etc/crontab(सिस्टम-वाइड crontab) में उपयोग किया जाता है । का उपयोग करते हुए sudo crontab -eआप आमतौर पर पाया जा सकता है जो जड़ के crontab साथ हैं काम कर रहे/var/spool/cron/crontabs
Matijs

2

क्रोन के साथ एक "समस्या" पर्यावरण चर ( स्पष्ट सुरक्षा कारणों के लिए) की कमी है । आपको शायद PATH और HOME याद आ रहे हैं। आप उन स्क्रिप्ट को सीधे या क्रॉस्टैब फ़ाइल में परिभाषित कर सकते हैं।

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

आपको तब तक परीक्षण करना होगा जब तक कि सभी आवश्यक चर स्क्रिप्ट के अनुसार आवश्यक न हों।


1
यहाँ केवल यही एक उत्तर है जो वास्तव में मेरे लिए काम करता है। मैंने /etc/crontabफ़ाइल से SHELL और PATH कथनों को कॉपी किया और उन्हें अंदर पेस्ट किया sudo crontab -eऔर कमांड बिना किसी समस्या के रूट के रूप में चला गया। धन्यवाद!
टेरेंस

0

क्रोन त्रुटि संदेश आमतौर पर - डिफ़ॉल्ट रूप से - ईमेल के माध्यम से भेजे जाते हैं। आप देख सकते हैं ईमेल के साथ रूट के लिए लगा सकते हैं कि sudo mailसिर्फ की सामग्री की जाँच करके, या /var/mail/root, जैसे sudo less /var/mail/root


यदि ईमेल संदेश मदद नहीं करते हैं, तो यह भी देखें /var/log/syslog:

sudo grep CRON /var/log/syslog

जैसा कि एलेक्सिस विल्के ने पहले ही कहा, क्रोन में पर्यावरण चर स्थापित करने के लिए अलग-अलग तंत्र हैं।

आपकी स्क्रिप्ट की जरूरत है

PATH=/sbin:/bin:/usr/bin

Crontab के लिए। HOMEजरूरी नहीं होना चाहिए। आपको अपनी स्क्रिप्ट में पूर्ण पथों का उपयोग करना चाहिए, जैसे कि /bin/dateइसके बजाय date। आप प्रत्येक आदेश के लिए उचित पथ पा सकते हैं which command_name, जैसे

$ which date
/bin/date

आपके सुझाए गए grep CRON को / var / log / syslog में चलाने से मुझे 11 फरवरी 14:37:01 Marius-PC CRON [7826]: (रूट) CMD (रूट /usr/bin/tunlrupetate.sh) Feb 11 14: मिल गया। 37:01 Marius-PC CRON [7825]: (रूट) मेल (आउटपुट का 1 बाइट मेल किया गया; लेकिन स्टेटस 0x00ff, # 012) फ़रवरी 11 14:39:01 Marius-PC CRON [7849]: (रूट) CMD ( [-x / usr / lib / php5 / maxlifetime] और& [-d / var / lib / php5] && find / var / lib / php5 / -depth -mindepth 1 -mddepth 1 -type f -cmin + $ (/ usrr / lib / php5 / maxlifetime)! -execdir fuser -s {} 2> / dev / null \ _ -delete) यदि मैं क्रोन में पथ के लिए कुछ निश्चितता जोड़ूं तो इनसे मेरे सिस्टम $ PATH पर कोई असर नहीं पड़ेगा?
एंटोनियो

उस आउटपुट का कहना है कि उसने कुछ ईमेल करने की कोशिश की लेकिन वह विफल रहा। इसका मतलब है कि, आपको वह त्रुटि संदेश नहीं मिल रहा है /var/mail/root। आप या तो इसे ठीक कर सकते हैं, या साथ में कोशिश कर सकते हैंPATH=...
Olli

@Antonio, वैकल्पिक रूप से, इस पैच किए गए संस्करण का
Olli

धन्यवाद। मुझे पता है कि मैंने सिस्टम ई-मेल को कॉन्फ़िगर नहीं किया था और मुझे पता था कि इसके माध्यम से नहीं जाना था। मैंने पहले से ही स्क्रिप्ट को किसी भी फ़ंक्शन के लिए निरपेक्ष पथ का उपयोग करने के लिए संशोधित किया था। आखिरी बात यह थी कि मेरा पिछला सवाल कॉटैब के भीतर एक पाथ परिभाषा है जो मेरे सिस्टम $ पैथ चर को गड़बड़ नहीं करेगी?
एंटोनियो

1
इस बीच मैं मूल स्क्रिप्ट से तारीख प्रारूप में एक बग को ठीक करने में व्यस्त था। यह% M के बजाय% m (जो कि महीने नहीं मिनट के लिए है) का उपयोग कर रहा था ...
एंटोनियो

0

आप इस लाइन को अपनी स्क्रिप्ट में जोड़ सकते हैं। इसलिए, जब आप क्रोन लॉग की जांच करते हैं और अपनी नौकरी के लिए समझौता करते हैं, तो आपको उसी $ PATH का क्रेडिट मिल सकता है।

/bin/echo $PATH > /root/path.txt

और शायद सबसे अच्छी बात आप क्रोन लिपियों में मुद्दों का निदान कर सकते हैं एसओ के सभी पर्यावरण चर आपकी स्क्रिप्ट में एनवी कमांड के साथ प्राप्त करते हैं। तो बस इस लाइन को अपनी स्क्रिप्ट में जोड़ें। तब आप आउटपुट का विश्लेषण कर सकते हैंallEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

एक अन्य ट्रिक स्क्रिप्ट के आउटपुट को कुछ जगह पर निर्देशित करना है। जोड़ रहा है /root/log.log। इस तरह से स्क्रिप्ट के सभी आउटपुट को बनाए रखा जाएगा/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

इसके अलावा, आप परीक्षण और जांच की सुविधा के लिए प्रत्येक मिनट को चलाने के लिए स्क्रिप्ट को शेड्यूल कर सकते हैं।

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