क्रोन: केवल ईमेल में त्रुटियां मिलती हैं?


38

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

क्या कुछ गलत होने पर यानी केवल CRON ईमेल भेजना संभव है। मेरा TARइरादा के रूप में निष्पादित नहीं करता है?

यहां बताया गया है कि इस समय मेरा क्रॉस्टैब कैसे सेटअप है;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

आपका बहुत बहुत धन्यवाद!

जवाबों:


53

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

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

यदि आपकी स्क्रिप्ट सामान्य रूप से आउटपुट का उत्पादन करती है, लेकिन आप क्रोन में इसकी परवाह नहीं करते हैं, तो बस इसे / dev / null में भेज दें और यह आपको केवल तभी ईमेल करेगा जब कुछ लिखा जाए।

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
यह शायद ही आदर्श है। आप सामान्य रूप से संपूर्ण आउटपुट (stdout + stderr) ई-मेल से चाहते हैं, जब कमांड एक गैर-शून्य त्रुटि कोड के साथ समाप्त हो। अन्यथा, यह आम तौर पर कम से कम stdout gobble करने के लिए ठीक है। मेरे लिए, यह क्रोन का एक डिज़ाइन दोष है।
विटिको

3
@Witiko मैं सहमत हूँ; मुझे यह सवाल ठीक लगा। मुझे लगता है कि आप अपने क्रोन कमांड बना सकते हैं /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
डैनियल एच

22

क्रॉनिक रैपर स्क्रिप्ट का उपयोग करना एक अच्छा विचार है; इसका उपयोग करने के लिए आपको अपनी स्क्रिप्ट को बदलने की आवश्यकता नहीं है।

के बजाय:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

करना:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

सीधे शब्दों में कहें; यदि सब कुछ सुचारू रूप से चलता है (निकास स्थिति 0), तो यह मौन चलेगा, लेकिन यह क्रियात्मक रूप से रिपोर्ट करेगा यदि नहीं, और क्रोन को मेल रिपोर्टिंग को संभालने दें।

पर अधिक जानकारी https://habilis.net/cronic/


मैं वास्तव में नहीं देखता कि यह कैसे मदद करेगा जब समस्या एक गलत क्रोन लाइन से ज्यादा कुछ नहीं है और क्रोन ठीक वही कर रहा है जो उसे करने के लिए कहा गया है।
जॉन गार्डनियर्स

3
@ जॉनगार्डियर्स यह मदद करता है क्योंकि कभी-कभी आपके पास एक त्रुटि के बिना आउटपुट होता है।
मिखाइल

11
वैकल्पिक रूप chronicसे, moreutilsपैकेज से: joeyh.name/code/moreutils
व्लादिमीर

4

आप विशेष रूप cronसे ईमेल भेजने के निर्देश दे रहे हैं , तब भी जब /bin/backup.sh(वैसे, यह होना चाहिए /usr/local/bin) सफल होता है। केवल | mail -s "Backup status" email@example.comभाग को छोड़ दें और ईमेल केवल तभी भेजा जाएगा जब आउटपुट होगा। आप शायद (अपने पर निर्भर करता है cron) स्पष्ट रूप से ईमेल पते को सेट करने के लिए crontab फ़ाइल में असाइनमेंट के रूप में मेल कर सकते हैं।

जानकारी के लिए, देखें

man 5 crontab

3

आपको stderrएएमडी को निर्देशित करना चाहिए stdoutऔर दोनों को नहीं stderr

उपयोग 1> /dev/nullन करें 2>&1और यह ठीक होना चाहिए। साथ ही, आपको अपनी बैकअप स्क्रिप्ट में त्रुटि की सही रिपोर्ट करने की आवश्यकता हो सकती है।


3

यहां एक और भिन्नता है जो मैंने कई वर्षों से सफलतापूर्वक उपयोग की है - आउटपुट कैप्चर करें और इसे केवल त्रुटि पर प्रिंट करें , ईमेल ट्रिगर करना। इसके लिए कोई अस्थायी फ़ाइलों की आवश्यकता नहीं है, और सभी आउटपुट को संरक्षित करता है । महत्वपूर्ण हिस्सा यह है 2>&1कि STDERR को STDOUT में रीडायरेक्ट किया जाता है।

डिफ़ॉल्ट क्रोन मेलर कॉन्फ़िगरेशन के माध्यम से संपूर्ण आउटपुट भेजें:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

समान लेकिन एक विशिष्ट पते और विषय के साथ:

(पते को पूरी Crontab फ़ाइल के लिए MAILTO = xxxx सेट करके भी बदला जा सकता है )

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

तुम भी त्रुटि पर कई कार्रवाई कर सकते हैं और ईमेल में जोड़ें:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

यह साधारण कमांड के लिए काम करेगा। यदि आप जटिल पाइप ( find / -type f | grep -v bla | tar something-or-other) के साथ काम कर रहे हैं , तो आप कमांड को स्क्रिप्ट में स्थानांतरित करने और पूर्वोक्त दृष्टिकोण का उपयोग करके स्क्रिप्ट चलाने से बेहतर हैं। कारण यह है कि यदि पाइप का कोई हिस्सा STDERR को आउटपुट करता है, तो भी आपको ईमेल मिलेंगे।

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