बाहर निकलने की स्थिति के आधार पर MAILTO को क्रोन ईमेल आउटपुट दें


11

मेरे पास एक क्रॉन जॉब है जो इस तरह से php कमांड चला रहा है:

php /path/to/script.php > dev/null

यह MAILTO पते पर केवल STDERR आउटपुट भेजना चाहिए। जब मैं php स्क्रिप्ट को इकट्ठा करता हूं, तो किसी भी STDERR जानकारी को आउटपुट नहीं कर रहा है, जब उसकी निकास स्थिति 1 है।

मैं php कमांड (STDOUT) का आउटपुट कैसे प्राप्त कर सकता हूं और केवल MAILTO को भेज सकता हूं यदि निकास की स्थिति शून्य न हो?

जवाबों:


12
php /path/to/script.php > logfile || cat logfile; rm logfile

logfileअगर मानक विफल हो जाता है और केवल इसे आउटपुट करता है यदि स्क्रिप्ट विफल हो जाती है (गैर-शून्य से बाहर निकल जाती है)।

नोट: अपनी स्क्रिप्ट भी करने के लिए उत्पादन हो सकता है यदि stderrतो आप पुनर्निर्देशित करना चाहिए stderrकरने के लिए stdout। अन्यथा कुछ भी मुद्रित stderrहोने पर क्रोन एक ईमेल भेजेगा भले ही बाहर निकलने का कोड 0 हो:

php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile

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

3

क्या आपने अधिक आंतों से जीर्ण माना है । मुझे लगता है कि यह वही करता है जो आप चाहते हैं:

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

हाल के सत्यापनों में, -eपूर्ण आउटपुट को दिखाने के लिए एक स्विच भी है अगर कुछ भी stderr को लिखा गया है।


2

चूंकि निर्गम स्थिति ज्ञात होने से पहले उत्पन्न होती है, इसलिए आपको इसे कहीं स्टोर करना होगा।

एक संभावना यह है कि इसे शेल चर में संग्रहीत किया जाए:

output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
  printf "%s\n" "$output"
fi

यह स्क्रिप्ट के आउटपुट को पूरी तरह से संरक्षित नहीं करता है (यह रिक्त लाइनों को पीछे हटाता है), लेकिन यह इस उपयोग के मामले के लिए ठीक है। यदि आप रिक्त लाइनों को पीछे छोड़ना चाहते हैं:

output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
  printf "%s" "${output%a}"
fi

यदि संभावित रूप से बहुत अधिक उत्पादन होता है, तो आप इसके बजाय एक अस्थायी फ़ाइल में संग्रहीत करना पसंद कर सकते हैं:

output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
  echo "script.php failed (status $ret), see the output in $output_file"
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.