ส่งอีเมล cron ไปที่ MAILTO ตามสถานะการออก


11

ฉันมีงาน cron ใช้คำสั่ง php ดังนี้:

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

สิ่งนี้ควรส่งเอาต์พุต STDERR ไปยังที่อยู่ MAILTO เท่านั้น จากสิ่งที่ฉันรวบรวมสคริปต์ php จะไม่แสดงผลข้อมูล STDERR ใด ๆ แม้ว่าสถานะการออกจะเป็น 1

ฉันจะรับเอาต์พุตของคำสั่ง php (STDOUT) และส่งไปยัง MAILTO ได้เฉพาะในกรณีที่สถานะออกไม่ใช่ศูนย์เท่านั้น

คำตอบ:


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

ซึ่งดัมพ์เอาต์พุตมาตรฐานไปยังlogfileและเอาต์พุตเฉพาะหากสคริปต์ล้มเหลว (ออกจากไม่ใช่ศูนย์)

หมายเหตุ: หากสคริปต์ของคุณอาจจะยังส่งออกไปstderrแล้วคุณควรจะเปลี่ยนเส้นทางไปยังstderr stdoutมิฉะนั้นสิ่งใดก็ตามที่พิมพ์ไว้stderrจะทำให้ cron ส่งอีเมลแม้ว่ารหัสการออกจะเป็น 0:

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

สิ่งนี้จะเริ่มต้นสำหรับสิ่งที่ปรากฏใน stderr ซึ่งไม่จำเป็นต้องหมายความว่ามีข้อผิดพลาด (เช่นเอาต์พุต debug)
hoffmanc

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.