जब तक त्रुटियाँ न हों, क्रोन ईमेल अक्षम करें?


12

त्रुटि होने पर मैं केवल क्रोन से ईमेल कैसे प्राप्त कर सकता हूं?

भारी बहुमत के मामलों में, कार्य ठीक चलेंगे - और मैं वास्तव में आउटपुट के बारे में परवाह नहीं करता हूं।

यह केवल एक विफलता के दुर्लभ मामले में है जिसे मैं जानना चाहता / चाहती हूं।

मैंने उपलब्ध घोषणा की है - लेकिन मुझे यकीन नहीं है कि मैं जो वर्णन कर रहा हूं वह "सही ढंग से" क्रॉन के लिए बाहरी रूप से प्रबंधित करना संभव है।


क्या होगा अगर crond ही नहीं चल रहा है? या मशीन ऑफ़लाइन है? इसलिए मैं क्रोन के ईमेल से कभी परेशान नहीं होता और समर्पित क्रोन मॉनिटरिंग सर्विस का उपयोग करता हूं। मैं WDT.io के लिए आंशिक हूं और इसकी सिफारिश करता हूं।
ईसाई पेकेलर

जवाबों:


8

जैसा कि आप आउटपुट की देखभाल नहीं कर रहे हैं, आप जॉब के STDOUT को रीडायरेक्ट कर सकते हैं /dev/nullऔर STDERR को मेल के माध्यम से भेजने ( MAILTOपर्यावरण चर का उपयोग करके ) कर सकते हैं।

इसलिए, उदाहरण के लिए:

...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null

केवल STDERR (STDERR के साथ) पर आउटपुट होने पर मेल भेजेगा, और STDOUT को छोड़ देगा।

यह निश्चित रूप से मानता है कि जब एक कार्यक्रम STDERR पर लिखा गया है, तो असफल रहा है; यह हमेशा मामला नहीं हो सकता है। यदि आपके पास कार्यक्रम पर नियंत्रण है, तो आप ऐसा कर सकते हैं। किसी भी जटिल मामले के लिए, आपको किसी प्रकार का एक आवरण लिखना चाहिए जो कमांड चलाता है और तदनुसार मेल भेजता है। और रैपर को cronकाम के रूप में रखें ।


1
इस दृष्टिकोण का नकारात्मक पक्ष यह है कि जब आप विफल हो जाते हैं तो आपको केवल एसटीडीआरआर आउटपुट प्राप्त होता है जो कि पूर्ण उत्पादन होने पर आपकी तुलना में कठिन निदान कर सकता है।
प्लगवॉश करें

11

chronicसे आदेश moreutils एक कमांड चुपचाप चलाता है जब तक कि यह विफल रहता है।

इसके मैनुअल से उद्धरण:

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

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


8

त्रुटि होने पर मैं केवल क्रोन से ईमेल कैसे प्राप्त कर सकता हूं?

आप क्रोन के साथ अपने क्रोन इनवोकेशन को लपेट सकते हैं , एक शेल स्क्रिप्ट जो क्रोन आउटपुट खाती है जब तक कि इन्वोक की गई प्रक्रिया का रिटर्न कोड नॉन-जीरो न हो या नॉन-ट्रेस एरर आउटपुट हो।

क्रॉनिक का उपयोग करने के लिए, स्क्रिप्ट को उपयुक्त स्थान पर डाउनलोड करें, जैसे कि /usr/local/bin। आपकी crontab प्रविष्टियों को स्क्रिप्ट (जैसे /usr/local/bin/cronic) के पथ के साथ उपसर्ग करना चाहिए , या बस cronic, बशर्ते कि आपका PATHसेट ठीक से सेट किया गया हो।

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

अन्य आवरण उपलब्ध हैं, जैसा कि क्रोनिक साइट से जुड़ा हुआ है:


1
है cronicसे संबंधित chronicहैं, या कि सिर्फ संयोग है?
टोबी स्पाइट

@TobySpeight संयोग ऐसा लगता है। cronicबैश में लागू किया गया है, chronicजैसा कि पहले उत्तर में सुझाया गया है एक पर्ल स्क्रिप्ट है।
कॉस्मिक ओस्सिफ्रेज

4

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

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

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

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

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 को आउटपुट करता है, तो भी आपको ईमेल मिलेंगे।


आप रखना चाहिए $OUTPUTउद्धरण में: "$OUTPUT"
जी-मैन का कहना है कि 'मोनिका'

@ जी-मैन फेयर पॉइंट, हमेशा एक मौका होता है कि आउटपुट में "-n" या कुछ समान हो सकता है।
अकोम

0

मैं शायद यह सब के माध्यम से नहीं सोचा है, लेकिन

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

सामान्य मामलों में, एक अस्थायी फ़ाइल के लिए सब कुछ पुनर्निर्देशित करें (आप शायद mktempएक अद्वितीय फ़ाइल नाम प्राप्त करने के लिए उपयोग करना चाहते हैं ), हटा दें कि यदि फ़ाइल सफल थी, और फिर catसामग्री फिर से, यदि वे अभी भी मौजूद हैं (यानी yourthing.sh से बाहर। त्रुटि स्थिति के साथ), क्रोन मेलर द्वारा उठाया जाए।

यदि मेमोरी कार्य करती है, तो क्रॉन पहले से ही कुछ भी नहीं भेजता है अगर कोई आउटपुट नहीं था, इसलिए यदि लॉग फ़ाइल खाली है या मौजूद नहीं है, तो कुछ भी नहीं होता है। (हम त्रुटि संदेश को पुनर्निर्देशित करते हैं।)

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