ฉันเห็นคำแนะนำมากมายเกี่ยวกับวิธีเรียกใช้ crontab แต่สิ่งที่ฉันต้องการในตอนนี้คือการเรียนรู้วิธีการ
- ค้นหาไฟล์บันทึกเกี่ยวกับงาน cron
- กำหนดค่าสิ่งที่ได้รับการบันทึก
ฉันเห็นคำแนะนำมากมายเกี่ยวกับวิธีเรียกใช้ crontab แต่สิ่งที่ฉันต้องการในตอนนี้คือการเรียนรู้วิธีการ
คำตอบ:
ตรวจสอบว่าโปรแกรมที่คุณรันด้วย cron มีไฟล์บันทึกของตัวเอง หากพวกเขาไม่เพียง แต่เขียนผลลัพธ์ของพวกเขาไปยังเอาท์พุทมาตรฐานคุณสามารถเปลี่ยนเส้นทางเหล่านี้ไปยังไฟล์หรือส่งเมล์มาที่คุณ ภายใน crontabs การเปลี่ยนเส้นทางเชลล์มาตรฐานทำงาน
เช่นเปลี่ยนเส้นทางข้อผิดพลาดของsome_job.sh
ไปยังsome_job.err
และยกเลิกการส่งออกมาตรฐาน (เช่นส่งไปที่/dev/null
) เพิ่มการเปลี่ยนเส้นทางต่อไปนี้เพื่อ crontab ของคุณ
33 3 * * * /path/to/some_job.sh 1> /dev/null 2> /other/path/to/some_job.err
หรือส่งทางไปรษณีย์ถึงคุณแทน (ถ้าmail
มี)
33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" you@example.org
/dev/null
?
some_job.sh
stdout ไปยัง/dev/null
และหลังจาก stderr ไปยัง stdout เท่านั้น (ซึ่งตอนนี้ไม่มีอะไรอีกแล้ว) วิธีการที่เพียง stderr มันจบลงใน stdout mail
และมีการส่งต่อไปยัง
cron daemons ส่วนใหญ่บนแพลตฟอร์มที่ฉันได้ทำงานกับอีเมล stdout / stderr ของงาน cron ของผู้ใช้โดยอัตโนมัติไปยังผู้ใช้ที่ crontab งานมาจาก ฉันลืมสิ่งที่เกิดขึ้นกับทั้งระบบ (งาน cron ที่ไม่ใช่ผู้ใช้เฉพาะจาก / etc / crontab) สิ่งคือคนไม่ได้ตั้งค่า mailer daemon (นั่นคือ Mail Transfer Agent (MTA) เช่น sendmail, qmail หรือ postfix) บน OSE ที่เหมือน Unix ส่วนใหญ่อีกต่อไป ดังนั้นอีเมลที่ส่งออกงาน cron เพียงแค่ตายในโฟลเดอร์อีเมลระวิงท้องถิ่นบางแห่งถ้าพวกเขาได้รับที่ห่างไกล ดังนั้นคำตอบเดียวอาจจะทำให้ดีมอน mailer ของคุณและอาจทำให้แน่ใจว่าคุณมีไฟล์ ~ / .forward เพื่อส่งต่อเมลโลคัลของคุณไปยังบัญชีอีเมล "จริง" ของคุณ
หากคุณต้องการให้งานของคุณเขียนไปยังไฟล์บันทึกที่เฉพาะเจาะจงคุณสามารถใช้การเปลี่ยนเส้นทางออกมาตรฐานเช่น @honk แนะนำหรือสมมติว่างาน cron ของคุณเป็นเชลล์สคริปต์คุณอาจมี logger โทรสคริปต์ (1) หรือ syslog (1) หรือ เครื่องมือบรรทัดคำสั่งอื่น ๆ ที่ระบบปฏิบัติการของคุณจัดเตรียมไว้สำหรับการส่งข้อความโดยพลการไปยัง syslog จากนั้นคุณสามารถใช้วิธีการในตัวของระบบปฏิบัติการสำหรับการกำหนดค่าว่าข้อความประเภทใดที่เข้าสู่ระบบโดยอาจแก้ไข /etc/syslog.conf
งาน cron ส่วนใหญ่ของฉันใช้สคริปต์ทุบตีที่ฉันเขียนเฉพาะเพื่อวัตถุประสงค์ในการเริ่มต้นโดย cron ด้วยเหตุผลเฉพาะ โดยเฉพาะอย่างยิ่งเมื่อฉันเขียนและแก้ไขจุดบกพร่องในขั้นต้นฉันชอบใช้ "set -vx" ของ bash เพื่อสร้างรูปแบบที่ไม่ขยายและขยายของแต่ละบรรทัดของสคริปต์เชลล์จะถูกเขียนไปยัง stdout ก่อนที่จะถูกดำเนินการ โปรดทราบว่าเชลล์สคริปต์ที่เริ่มต้นจาก cron ถือเป็นเชลล์ที่ไม่ใช่การล็อกอินและไม่โต้ตอบดังนั้นสคริปต์การเริ่มต้นเชลล์มาตรฐานของคุณเช่น. bashrc และ. profile จะไม่ทำงาน หากคุณใช้ bash และต้องการ bash เพื่อเรียกใช้สคริปต์เริ่มต้นคุณต้องกำหนดตัวแปรสภาพแวดล้อม "BASH_ENV = / path / to / my / startup / script" ใน crontab ของคุณก่อนบรรทัดที่คุณกำหนดงาน
mail
คำสั่งเพื่ออ่านข้อความจากบรรทัดคำสั่ง /var/spool/mail
หรือดูที่ แต่ถ้าคุณติดตั้ง postfix หรือ mailer อื่นที่ไม่ใช่ sendmail มาตรฐานจำเป็นต้องมีวิธีการอ่านข้อความอีกวิธีหนึ่ง
mail -s "cron output" test@example.com
ทำงานได้ดี: /
less $MAIL
หากคุณต้องการเห็นเอาต์พุต cron สำหรับผู้ใช้ปัจจุบันหรือless /var/spool/mail/root
หากคุณต้องการเห็นเอาต์พุต cron สำหรับคำสั่งที่ทำงานเป็นรูท
ภารกิจ cron กำลังดำเนินการรับผิดชอบการบันทึกของตนเอง
วิธีที่ง่ายที่สุดคือการบันทึกข้อผิดพลาดการพิมพ์และบันทึกแล้วในไฟล์ ฉันมี cronjob ที่เรียกบรรทัดคำสั่ง php เช่นนี้
1 0 * * * php /pathOfMyApp/index.php controllerName functionName> / pathOfMyApp / log / myErrorLog 2> & 1
ส่วนก่อน '>' เป็น cronjob ของฉันและหลังจาก '>' มันเป็นการจับและบันทึกในไฟล์ที่อยู่ในโฟลเดอร์บันทึกในรากของโครงการของฉัน แต่อาจอยู่ในตำแหน่งที่คุณต้องการ ใช้ความระมัดระวัง: cronjob ทุกครั้งจะถูกเรียกว่าเขาจะเขียนทับบันทึกล่าสุด คุณสามารถใช้ '>>' เพื่อเขียนท้ายไฟล์ที่มีอยู่หรือค้นหาคำสั่ง 'cat' เทอร์มินัล
หาก crontab ของคุณใช้ 'curl' หรือ 'wget' และอ้างอิงถึงลิงก์คุณสามารถค้นหาใน / var / log / httpd / appName สำหรับการเข้าถึงบันทึกถ้า cron กลับมาด้วย 500 หรือ 400 จะต้องมีบางอย่างผิดปกติ
ในที่สุดคุณสามารถตรวจสอบ / var / log / ข้อความได้เช่นกัน
ฉันคิดว่าการเปลี่ยนเส้นทางภายในไฟล์ cron อาจไม่ใช่ตัวเลือกที่ดีที่สุดในกรณีนี้
บ่อยครั้งที่คุณต้องการให้การบันทึกการบันทึกร่วมกับสคริปต์งาน cron ในกรณีนี้ฉันขอแนะนำสิ่งต่อไปนี้:
#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>
สิ่งนี้จะผนวกเอาท์พุทจากงาน cron ไปยังไฟล์ capture-log.txt
ฉันชอบรับอีเมลรายงานเกี่ยวกับงาน cron เพียงแค่ใส่
MAILTO=yourmail@domain.com
ลงใน crontab แล้วคุณจะได้รับอีเมล แน่นอนคุณต้องกำหนดค่าอีเมลสำหรับบัญชีของคุณ