การบันทึกเอาต์พุต stderr ทั้งหมดของ crontab ไปยังไฟล์


12

ตัวอย่างเช่นฉันสามารถบันทึกstderrหนึ่งสคริปต์ด้วยวิธีนี้:

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

แต่ฉันต้องการบันทึกstderrสคริปต์ทั้งหมดใน crontab ของฉัน ฉันสามารถผนวก> /var/log.txt 2>&1สคริปต์ทั้งหมด cronแต่มันไม่ดีถ้าผมมีหลายร้อยของสคริปต์ใน มีวิธีอื่นที่ง่ายกว่านี้หรือไม่?

คำตอบ:


6

ใน crontab คุณสามารถตั้งค่า MAILTO ให้ชี้ไปที่อีเมลแทนที่รันสคริปต์ สคริปต์นั้นจะยอมรับข้อความอีเมลถอดส่วนหัวและ goop อื่น ๆ แล้วบันทึกส่วนที่เหลือด้วยตัวบันทึก เนื่องจากเอาต์พุต cron script ทั้งหมดถูกส่งไปยังที่อยู่ที่ระบุโดย MAILTO คุณจะต้องบันทึกทุกอย่าง

ตัวอย่าง: ใน crontab

MAILTO=myalias

ใน / etc / mail / aliases (สมมติว่าคุณใช้ sendmail)

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

และให้สคริปต์ดึงส่วนหัวจดหมายออกและประมวลผลเอาต์พุต cron


คุณจะเจาะจงมากขึ้นเกี่ยวกับการตั้งค่า MAILTO, alias, MTA, script ฯลฯ ได้ไหม?
endolith

1
@endolith ฉันได้แก้ไขคำตอบเพื่อให้การตั้งค่าพื้นฐานซึ่งควรใช้กับ sendmail และ MTA ที่ทำงานร่วมกันได้ในวงกว้าง คุณจะต้องเขียนสคริปต์ด้วยตัวเอง
Kyle Jones

5

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

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

เพิ่มที่จุดเริ่มต้นของสคริปต์ทั้งหมดของคุณเพื่อบันทึกทุกอย่างและหยุดที่ข้อผิดพลาดแรก

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

ลำดับการเปลี่ยนเส้นทางควรตรงข้ามหรือไม่ > /var/log/YOUR_LOG_FILE 2>&1เช่นเปลี่ยนเส้นทาง stdout ไปยังไฟล์ก่อนจากนั้นเปลี่ยนเส้นทาง stderr ไปยัง stdout (ซึ่งตอนนี้ชี้ไปที่ไฟล์)
jfs

มันค่อนข้างบ้าที่บนเซิร์ฟเวอร์ขนาดเล็กที่คุณต้องติดตั้งบริการอีเมลและอาจเป็นไคลเอนต์อีเมลเพียงเพื่ออ่านข้อผิดพลาดที่ผลิตโดย Cron รู้สึกเหมือนเป็นการตัดสินใจแบบอนาธิปไตย
James McMahon

0

สคริปต์ของ Ryan Ye ที่/programming//a/7145618/20774มีประโยชน์สำหรับสิ่งนี้เช่นกันแม้ว่าจะเป็นทั้ง stdout และ stderr


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