ปิดใช้งานอีเมล cron เว้นแต่มีข้อผิดพลาดหรือไม่


12

ฉันจะรับอีเมลจาก cron ได้ก็ต่อเมื่อมีข้อผิดพลาดเท่านั้น

ในกรณีส่วนใหญ่ที่โด่งดังงานจะทำงานได้ดี - และฉันไม่สนใจเกี่ยวกับผลลัพธ์

เป็นเพียงในกรณีที่หายากของความล้มเหลวที่ฉันต้องการ / จำเป็นต้องรู้

ฉันมีprocmailพร้อมใช้งาน - แต่ฉันไม่แน่ใจว่าสิ่งที่ฉันกำลังอธิบายเป็นไปได้ที่จะจัดการ cron ภายนอก "ถูกต้อง"


เกิดอะไรขึ้นถ้า crond เองไม่ทำงาน? หรือเครื่องออฟไลน์อยู่? นั่นเป็นเหตุผลที่ฉันไม่เคยรำคาญอีเมลจาก cron และใช้บริการตรวจสอบ cron เฉพาะ ฉันเป็นส่วนหนึ่งของ WDT.io และแนะนำ
Christian Pekeler

คำตอบ:


8

เมื่อคุณไม่สนใจเอาต์พุตคุณสามารถเปลี่ยนทิศทาง STDOUT ของงานไปยัง/dev/nullและปล่อยให้ STDERR ส่งผ่านทางอีเมล (โดยใช้MAILTOตัวแปรสภาพแวดล้อม)

ตัวอย่างเช่น:

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

จะส่งเมลเมื่อมีเอาต์พุตเฉพาะใน STDERR (พร้อมกับ STDERR) และจะยกเลิก STDOUT

หลักสูตรนี้อนุมานว่าเมื่อโปรแกรมเขียนบน STDERR แล้วล้มเหลว นี่อาจไม่เป็นเช่นนั้นเสมอไป หากคุณมีอำนาจควบคุมโปรแกรมคุณสามารถทำได้ สำหรับกรณีที่ซับซ้อนคุณควรเขียน wrapper บางชนิดที่รันคำสั่งและส่งเมลตามลำดับ และใส่เสื้อคลุมเป็นcronงาน


1
ข้อเสียของวิธีการนี้คือเมื่อล้มเหลวคุณจะได้รับเอาต์พุต STDERR ซึ่งอาจทำให้การวินิจฉัยยากขึ้นกว่าที่คุณมีเอาต์พุตเต็ม
ปลั๊กอิน

11

chronicคำสั่งจากmoreutilsรันคำสั่งอย่างเงียบ ๆ จนกว่าจะล้มเหลว

ข้อความจากคู่มือ:

เรื้อรังรันคำสั่งและจัดเรียงสำหรับข้อผิดพลาดมาตรฐานและข้อผิดพลาดมาตรฐานที่จะแสดงต่อเมื่อคำสั่งล้มเหลว (ออกจากไม่ใช่ศูนย์หรือล่ม) หากคำสั่งประสบความสำเร็จเอาต์พุตภายนอกใด ๆ จะถูกซ่อนไว้

การใช้งานทั่วไปสำหรับเรื้อรังสำหรับการเรียกใช้งาน cron แทนที่จะพยายามทำให้คำสั่งเงียบลงและต้องจัดการกับอีเมลที่มีเอาต์พุตโดยไม่ตั้งใจเมื่อมันสำเร็จและไม่ได้ผลลัพธ์ที่เพียงพอเมื่อล้มเหลวคุณสามารถรันมันได้ทุกครั้งและใช้เรื้อรังเพื่อซ่อนผลลัพธ์ที่ประสบความสำเร็จ


8

ฉันจะรับอีเมลจาก cron ได้ก็ต่อเมื่อมีข้อผิดพลาดเท่านั้น

คุณสามารถล้อม cron invocations ด้วยcronicซึ่งเป็นเชลล์สคริปต์ที่กินเอาต์พุต cron ยกเว้นว่าโค้ดส่งคืนของกระบวนการที่เรียกใช้นั้นไม่ใช่ศูนย์หรือมีเอาต์พุตข้อผิดพลาดที่ไม่ติดตาม

หากต้องการใช้ Cronic /usr/local/binดาวน์โหลดสคริปต์เพื่อให้สถานที่ที่เหมาะสมเช่น รายการ crontab ของคุณจะต้องนำหน้าด้วยเส้นทางไปยังสคริปต์ (เช่น/usr/local/bin/cronic) หรือเพียงแค่ตั้งค่าcronicของคุณPATHอย่างถูกต้อง

โปรดทราบว่า "ข้อผิดพลาด" เป็นคำที่ไม่ถูกต้องในคำถามของคุณและต้องการคำจำกัดความอย่างระมัดระวัง เพื่อให้ cronic มีประโยชน์คุณต้องตรวจสอบให้แน่ใจว่างานที่คุณห่อด้วยรายงานข้อผิดพลาดเรื้อรังด้วยวิธีใดวิธีหนึ่งที่กำหนดเงื่อนไขข้อผิดพลาด วิธีการรายงานโดยนัยเช่นการเขียนสตริงข้อความSTDOUTจะต้องมีการคิดเพิ่มเติมเพื่อให้เข้ากันได้กับกลไกการรายงาน cron หรือกลไกอื่น

มีเครื่องห่ออื่น ๆ ซึ่งเชื่อมโยงจากไซต์เรื้อรัง:


1
มีความcronicเกี่ยวข้องกับchronicหรือว่าเป็นเรื่องบังเอิญ?
Toby Speight

@TobySpeight บังเอิญดูเหมือนว่า cronicถูกนำมาใช้ในทุบตีchronicตามที่แนะนำในคำตอบก่อนหน้านี้เป็นสคริปต์ Perl
จักรวาล Ossifrage

4

นี่คือรูปแบบอื่นที่ผมเคยใช้ประสบความสำเร็จมานานหลายปี - ส่งออกการจับภาพและพิมพ์ออกมาเฉพาะในข้อผิดพลาด นี้ไม่จำเป็นต้องไฟล์ temp และเก็บรักษาผลผลิตทั้งหมด ส่วนที่สำคัญคือการ2>&1เปลี่ยนเส้นทาง STDERR ไปยัง STDOUT

ส่งเอาต์พุตทั้งหมดผ่านการกำหนดค่า cron mailer ที่เป็นค่าเริ่มต้น:

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 ; }

สิ่งนี้จะทำงานกับคำสั่งง่าย ๆ หากคุณกำลังจัดการกับ pipes ที่ซับซ้อน ( find / -type f | grep -v bla | tar something-or-other) คุณควรย้ายคำสั่งไปยังสคริปต์และเรียกใช้สคริปต์โดยใช้วิธีการดังกล่าวข้างต้น เหตุผลก็คือถ้าส่วนใดส่วนหนึ่งของไพพ์ส่งออกไปยัง STDERR คุณจะยังคงได้รับอีเมล


คุณควรใส่$OUTPUTเครื่องหมายคำพูด: "$OUTPUT".
G-Man กล่าวว่า 'Reinstate Monica'

@ G-Man Fair point มีโอกาสเสมอที่เอาต์พุตอาจมี "-n" หรือบางอย่างที่คล้ายกัน
Akom

0

ฉันอาจไม่ได้คิดอย่างนี้ตลอดทาง แต่

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

ในกรณีปกติให้เปลี่ยนเส้นทางทุกสิ่งไปยังไฟล์ชั่วคราว (คุณอาจต้องการใช้mktempเพื่อรับชื่อไฟล์ที่ไม่ซ้ำกัน) ให้ลบไฟล์นั้นหากไฟล์นั้นประสบความสำเร็จและจากนั้นcatเนื้อหาอีกครั้งหากยังคงอยู่ (เช่น yourthing.sh ด้วยเงื่อนไขข้อผิดพลาด) ที่จะรับโดย cron mailer

หากหน่วยความจำทำหน้าที่ cron จะไม่ส่งสิ่งใดหากไม่มีเอาต์พุตดังนั้นหากไฟล์บันทึกว่างเปล่าหรือไม่มีอยู่จะไม่มีสิ่งใดเกิดขึ้น (เราเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดออกไป)

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