ฉันจะดูผลลัพธ์ของงาน cron ของฉันได้อย่างไร


66

ฉันเห็นคำแนะนำมากมายเกี่ยวกับวิธีเรียกใช้ crontab แต่สิ่งที่ฉันต้องการในตอนนี้คือการเรียนรู้วิธีการ

  1. ค้นหาไฟล์บันทึกเกี่ยวกับงาน cron
  2. กำหนดค่าสิ่งที่ได้รับการบันทึก

คำตอบ:


66

ตรวจสอบว่าโปรแกรมที่คุณรันด้วย 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

นี่คือวิธีที่ฉันแก้ไขปัญหา cron เสมอ
physicsmichael

นั่นเป็นตัวอย่างที่สองใช่มั้ย มันจะไม่เปลี่ยนเส้นทางทุกอย่างเพื่อ/dev/null?
Timmmm

7
@ Timmmm: ฉันทำงาน ก่อนอื่นมันเปลี่ยนเส้นทางทุกอย่างจากsome_job.shstdout ไปยัง/dev/nullและหลังจาก stderr ไปยัง stdout เท่านั้น (ซึ่งตอนนี้ไม่มีอะไรอีกแล้ว) วิธีการที่เพียง stderr มันจบลงใน stdout mailและมีการส่งต่อไปยัง
Benjamin Bannier

9

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 ของคุณก่อนบรรทัดที่คุณกำหนดงาน


3
สิ่งนี้ถูกต้อง หนึ่งสามารถใช้mailคำสั่งเพื่ออ่านข้อความจากบรรทัดคำสั่ง /var/spool/mailหรือดูที่ แต่ถ้าคุณติดตั้ง postfix หรือ mailer อื่นที่ไม่ใช่ sendmail มาตรฐานจำเป็นต้องมีวิธีการอ่านข้อความอีกวิธีหนึ่ง
akostadinov

เหตุใดเราจึงต้องการตัวแทนบริการอีเมลสำหรับสิ่งนี้ mail -s "cron output" test@example.comทำงานได้ดี: /
Martin Konecny

บน CentOS cron output ของฉันได้รับ "mailed" ไปยัง / var / spool / mail ดูโดยเรียกใช้less $MAILหากคุณต้องการเห็นเอาต์พุต cron สำหรับผู้ใช้ปัจจุบันหรือless /var/spool/mail/rootหากคุณต้องการเห็นเอาต์พุต cron สำหรับคำสั่งที่ทำงานเป็นรูท
sffc


2

วิธีที่ง่ายที่สุดคือการบันทึกข้อผิดพลาดการพิมพ์และบันทึกแล้วในไฟล์ ฉันมี 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 / ข้อความได้เช่นกัน


1

ฉันคิดว่าการเปลี่ยนเส้นทางภายในไฟล์ cron อาจไม่ใช่ตัวเลือกที่ดีที่สุดในกรณีนี้

บ่อยครั้งที่คุณต้องการให้การบันทึกการบันทึกร่วมกับสคริปต์งาน cron ในกรณีนี้ฉันขอแนะนำสิ่งต่อไปนี้:

#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>

สิ่งนี้จะผนวกเอาท์พุทจากงาน cron ไปยังไฟล์ capture-log.txt


1

ฉันชอบรับอีเมลรายงานเกี่ยวกับงาน cron เพียงแค่ใส่

MAILTO=yourmail@domain.com

ลงใน crontab แล้วคุณจะได้รับอีเมล แน่นอนคุณต้องกำหนดค่าอีเมลสำหรับบัญชีของคุณ


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