फ़ाइल करने के लिए crontab के सभी stderr आउटपुट लॉगिंग


12

उदाहरण के लिए, मैं stderrएक स्क्रिप्ट को इस तरह से लॉग इन कर सकता हूं :

* * * * * run_script.sh > /var/log.txt 2>&1

लेकिन मैं stderrअपने स्क्रिप्ट में सभी स्क्रिप्ट्स को लॉग इन करना चाहता हूं। मैं > /var/log.txt 2>&1सभी लिपियों के लिए अपील कर सकता हूं , लेकिन अगर मेरे पास सैकड़ों स्क्रिप्ट हैं तो यह अच्छा नहीं है cron। क्या ऐसा करने का एक और सरल तरीका है?

जवाबों:


6

Crontab में, आप एक मेल उपनाम के लिए MAILTO को सेट कर सकते हैं जो स्क्रिप्ट चलाता है। वह स्क्रिप्ट एक मेल संदेश को स्वीकार करेगी, हेडर और अन्य goop को अलग करेगी, और शेष को लकड़हारे के साथ लॉग करेगी। चूंकि सभी क्रोन स्क्रिप्ट आउटपुट MAILTO द्वारा निर्दिष्ट पते पर भेजे जाते हैं, आप सब कुछ कैप्चर करेंगे।

उदाहरण: क्रॉस्टैब में

MAILTO=myalias

In / etc / mail / aliases (यह मानते हुए कि आप Sendmail का उपयोग कर रहे हैं)

myalias:"|/usr/local/bin/my-processing-script.sh"

और मेल हेडर से स्क्रिप्ट स्ट्रिप है और क्रोन आउटपुट प्रोसेस करते हैं।


क्या आप MAILTO, उपनाम, MTA, स्क्रिप्ट आदि की स्थापना के बारे में अधिक विशिष्ट हो सकते हैं?
एंडोलिथ

1
@endolith मैंने एक मूल सेटअप देने के लिए उत्तर को संपादित किया है जो कि sendmail और मोटे तौर पर संगत MTA के लिए काम करना चाहिए। आपको स्क्रिप्ट खुद लिखनी होगी।
काइल जोन्स 3

5

कमांड द्वारा उत्पादित कोई भी आउटपुट MAILTO पर्यावरण चर में निर्दिष्ट उपयोगकर्ता को भेजा जाता है जैसा कि crontab (5) फ़ाइल में सेट किया जाता है, या यदि कोई MAILTO चर सेट नहीं किया जाता है (या यदि यह एक (1) या बैच (1) कार्य है ), नौकरी के मालिक को। यदि कोई कमांड कोई आउटपुट नहीं देता है या यदि MAILTO पर्यावरण चर खाली स्ट्रिंग पर सेट है, तो कोई मेल नहीं भेजा जाएगा।

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

सब कुछ लॉग इन करने और पहली त्रुटि पर रुकने के लिए अपनी सभी लिपियों की शुरुआत में इसे जोड़ें

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e

क्या पुनर्निर्देशन क्रम विपरीत होना चाहिए? > /var/log/YOUR_LOG_FILE 2>&1यानी, किसी फ़ाइल में पहले रीडायरेक्ट करें और उसके बाद ही stdout (जो अब फ़ाइल पर इंगित करता है) के लिए स्ट्रीडर पुनर्निर्देशित करें।
JFS

यह बहुत पागल है कि एक न्यूनतम सर्वर पर जिसे आपको मेल सेवा स्थापित करने की आवश्यकता है, और संभवतः एक मेल क्लाइंट, केवल क्रोन द्वारा निर्मित त्रुटियों को पढ़ने के लिए। यह अराजकतावादी डिजाइन निर्णय की तरह लगता है।
जेम्स मैकमोहन

0

Https://stackoverflow.com/a/7145618/20774 पर रयान ये की स्क्रिप्ट इसके लिए भी उपयोगी है, हालांकि यह स्टडआउट और स्टैडर दोनों करती है।


मेरे पास एक छोटी स्क्रिप्ट है cronlog.sh ऐसा करने के लिए। स्क्रिप्ट कोड

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

तब आप कर सकते थे

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

उदाहरण परिणाम

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.