cron पहले से ही क्रोन जॉब के मालिक को मेल द्वारा चलाए जाने वाले हर काम के मानक आउटपुट और मानक त्रुटि भेजता है।
आप उपयोग कर सकते हैं MAILTO=recipientमें crontabफ़ाइल किसी दूसरे खाते में ईमेल भेजना।
इस काम के लिए, आपको मेल ठीक से काम करने की आवश्यकता है। स्थानीय मेलबॉक्स में वितरित करना आमतौर पर कोई समस्या नहीं है (वास्तव में, संभावनाएं ls -l "$MAIL"प्रकट होंगी कि आप पहले से ही कुछ प्राप्त कर रहे हैं) लेकिन इसे बॉक्स से बाहर करना और इंटरनेट पर एमटीए (पोस्टफिक्स, सेंडमेल, आपके पास क्या है) की आवश्यकता है दुनिया से जुड़ने के लिए ठीक से कॉन्फ़िगर किया गया है।
यदि कोई आउटपुट नहीं है, तो कोई ईमेल उत्पन्न नहीं किया जाएगा।
एक सामान्य व्यवस्था एक आउटपुट को फ़ाइल में पुनर्निर्देशित करने की है, जिसमें क्रोन डेमॉन निश्चित रूप से किसी भी आउटपुट को वापस नहीं करेगा। एक संस्करण मानक आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करना है (या स्क्रिप्ट लिखना है तो यह कभी भी प्रिंट नहीं करता है - शायद इसके परिणामस्वरूप डेटाबेस में स्टोर होता है या रखरखाव कार्य करता है जो केवल कुछ भी आउटपुट नहीं करता है?) और केवल एक ईमेल प्राप्त होता है अगर वहाँ एक त्रुटि संदेश है।
दोनों आउटपुट स्ट्रीम को पुनर्निर्देशित करने के लिए, वाक्यविन्यास है
42 17 * * * script >>stdout.log 2>>stderr.log
ध्यान दें कि हम >>ओवरराइट के बजाय कैसे (डबल ) एपेंड करते हैं , ताकि किसी भी पिछले नौकरी के आउटपुट को अगले से बदल न जाए।
जैसा कि यहां कई उत्तरों में सुझाया गया है, आप दोनों आउटपुट स्ट्रीम एक ही फाइल में भेज सकते हैं; दूसरी रीडायरेक्शन को 2>&1यह कहने के साथ बदलें कि "मानक त्रुटि जहां भी मानक आउटपुट जा रहा है, उसे जाना चाहिए"। (लेकिन मैं विशेष रूप से इस प्रथा का समर्थन नहीं करता हूं। यह मुख्य रूप से समझ में आता है अगर आप वास्तव में मानक आउटपुट पर कुछ भी उम्मीद नहीं करते हैं, लेकिन कुछ अनदेखी कर सकते हैं, शायद एक बाहरी उपकरण से आ रहा है जिसे आपकी स्क्रिप्ट से कहा जाता है।)
cronआपके होम डायरेक्टरी में नौकरियां चलती हैं, इसलिए किसी भी रिश्तेदार फ़ाइल नाम के सापेक्ष होना चाहिए। यदि आप अपने घर निर्देशिका के बाहर लिखना चाहते हैं, तो आपको स्पष्ट रूप से यह सुनिश्चित करने की आवश्यकता है कि आपने उस गंतव्य फ़ाइल तक पहुंच लिखी है।
एक सामान्य एंटीपैटर सब कुछ पुनर्निर्देशित करना है /dev/null(और फिर स्टैक ओवरफ्लो से यह जानने में मदद करें कि क्या गलत है जब काम नहीं कर रहा है, लेकिन हम खोए हुए आउटपुट को नहीं देख सकते हैं!)
अपनी स्क्रिप्ट के भीतर, नियमित आउटपुट (वास्तविक परिणाम, आदर्श रूप से मशीन-पठनीय रूप में) और डायग्नोस्टिक्स (आमतौर पर एक मानव पाठक के लिए स्वरूपित) को अलग रखना सुनिश्चित करें। एक शेल स्क्रिप्ट में,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
कुछ प्लेटफ़ॉर्म (और जीएनयू अवाक) आपको /dev/stderrत्रुटि संदेशों के लिए फ़ाइल नाम का उपयोग करने की अनुमति देते हैं , लेकिन यह ठीक से पोर्टेबल नहीं है; पर्ल में, warnऔर dieमानक त्रुटि के लिए प्रिंट; पायथन में, लिखें sys.stderrया उपयोग करें logging; रूबी में, कोशिश करो $stderr.puts। यह भी देखें कि त्रुटि संदेशों में उस स्क्रिप्ट का नाम कैसे शामिल होना चाहिए जो नैदानिक संदेश का उत्पादन करती है।