บันทึกข้อผิดพลาด cron อยู่ที่ไหน


170

หากฉันตั้งค่าcronงานไม่ถูกต้องพวกเขาดูเหมือนจะล้มเหลวในทันที ฉันควรค้นหาบันทึกข้อผิดพลาดที่จะเข้าใจสิ่งที่ผิดพลาดหรือไม่

คำตอบ:


106

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

  1. crond ไม่สามารถแม้แต่เริ่มต้นเชลล์สำหรับการเรียกใช้โปรแกรมหรือส่งอีเมล
  2. crond มีปัญหาในการส่งออกทางไปรษณีย์หรือจดหมายสูญหาย
  3. โปรแกรมไม่ได้สร้างเอาต์พุตใด ๆ (รวมถึงข้อความแสดงข้อผิดพลาด)

กรณีที่ 1. ไม่น่าเป็นไปได้มาก แต่มีบางสิ่งที่ควรเขียนในบันทึก cron Cron มีสิ่งอำนวยความสะดวก syslog ที่สงวนไว้ดังนั้นคุณควรตรวจสอบ/etc/syslog.conf(หรือไฟล์ที่เทียบเท่าใน distro ของคุณ) เพื่อดูว่าข้อความของสถานที่cronนั้นถูกส่งไปที่ใด สถานที่ท่องเที่ยวที่เป็นที่นิยม ได้แก่/var/log/cron, และ/var/log/messages/var/log/syslog

2. ในกรณีที่คุณควรตรวจสอบบันทึกจดหมายภูต: ข้อความจากภูต Cron root@yourhostมักจะปรากฏเป็นจาก คุณสามารถใช้MAILTO=...บรรทัดในไฟล์ crontab เพื่อให้ cron ส่งอีเมลไปยังที่อยู่เฉพาะซึ่งควรทำให้ grep ของ mailer daemon บันทึกง่ายขึ้น ตัวอย่างเช่น

MAILTO=my.offsite.email@example.org
00 15 * * *  echo "Just testing if crond sends email"

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

00 15 * * * /a/command; touch /tmp/a_command_has_run

เพื่อให้คุณสามารถตรวจสอบว่าcrondมีการทำงานบางอย่างจริงโดยดูที่ mtime /tmp/a_command_has_runของ


3
"อีเมล" เหล่านี้ไปในไฟล์ด้วยหรือไม่ ฉันใช้เว็บโฮสติ้งที่ใช้ร่วมกันและไม่คิดว่าพวกเขาจะรู้ว่าจะส่งอีเมลถึงฉัน
นาธานลอง

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

1
ขึ้นอยู่กับเอเจนต์การถ่ายโอนเมลของคุณคุณอาจพบเมลที่ไม่ได้ส่งในไฟล์ที่เรียกว่าdead.letterในรูทหรือโฮมไดเร็กทอรีของผู้ใช้ที่เกี่ยวข้อง
Dario Seidl

43

คุณสามารถส่งเอาต์พุตงานไปยังไฟล์บันทึกได้อย่างชัดเจน:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

โปรดทราบว่าสิ่งนี้จะทำให้พฤติกรรมของอีเมลที่กล่าวถึงก่อนหน้านี้มีขนาดใหญ่กว่าเพราะตัวของ crond จะไม่ได้รับผลลัพธ์ใด ๆ จากงาน หากคุณต้องการรักษาพฤติกรรมนั้นคุณควรดูที (1)


9
ทำไมไม่ใช้>>แทน>ดังนั้นคุณจะไม่เขียนทับไฟล์บันทึกทุกครั้ง?
Chris

แน่นอน! การเปลี่ยนเส้นทาง I / O ใด ๆ จะทำแม้ว่า| /usr/bin/loggerคุณจะต้องการตามที่ Stefan แนะนำอย่างชาญฉลาด เลือกพิษของคุณ: tldp.org/LDP/abs/html/io-redirection.html
codehead

cron สร้างไฟล์บันทึกนี้myjob.logด้วยขนาด 0 ตามที่คาดไว้ แต่บันทึกไว้ในไฟล์อื่นฉันจะเปลี่ยนการตั้งค่านี้ได้ที่ไหน
นักบัญชีم

42

หากคุณไม่เห็นอีเมลคุณอาจกำลังรูทสแปม @ yourcompany ด้วยข้อผิดพลาดซึ่งอาจสร้างความรำคาญให้กับผู้ที่ใช้บัญชีนั้นเพื่อตรวจสอบ ลองส่งผลลัพธ์ไปที่ Syslog แทน:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag

จากนั้นรอให้ cronjob รันและค้นหาข้อผิดพลาดใน / var / log / messages (หรือ /var/log/user.log ในบางระบบ)

ใช้งานได้ดีกับข้อความแสดงข้อผิดพลาดซึ่งมีความยาวเพียง 1-2 บรรทัดเช่น "yourcronjob: command not found" นอกจากนี้ยังใช้ประโยชน์จากโครงสร้างพื้นฐาน syslog ที่มีอยู่ของคุณ (Logrotation, Central syslogging, Splunk และอื่น ๆ ) นอกจากนี้ยังช่วยลดสแปมอีเมลที่จะรูท

มันอาจไม่ใช่วิธีที่ดีถ้า cronjob ของคุณสร้างเอาต์พุตหลายร้อยบรรทัด


8

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

นี่คือการตั้งค่าที่กำหนดค่าได้ในการใช้ cron บางตัว


7

คุณควรได้รับอีเมล์crondเมื่องานล้มเหลวในการรันหรือเมื่องานส่งคืนโค้ดการออกที่ไม่ใช่ศูนย์ ลองพิมพ์:

$ mailx

ที่พรอมต์คำสั่ง

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

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


5

Cron บันทึกข้อมูลพื้นฐานไปยัง/var/log/messagesแต่ส่งเอาต์พุตโปรแกรมใด ๆ ไปยังผู้ใช้ที่เรียกใช้


ไม่มี/var/log/messagesบนเซิร์ฟเวอร์ Ubuntu ของฉัน ( 4.4.0-128-generic #154-Ubuntu SMP) มีความคิดอะไรไหม ฉันมีงาน cron สองสามงานที่กำหนดไว้ในrootcrontab เป็นเวลาหลายเดือน (เช่นapt autoremove) แต่ดูเหมือนไม่มีงานใดที่จะถูกประหารชีวิต
Dan Dascalescu

2

ฉันสะดุดในหัวข้อนี้ไม่กี่ปีที่ผ่านมาพบปัญหาเดียวกันและเพิ่งมาเจอวิธีแก้ปัญหาดังกล่าวโดย Ricardo การขาดอีเมลนั้นยากที่จะตรวจจับ (ตามที่คุณพูดถึง) และแน่นอนว่าคุณไม่ต้องการสแปมอีเมลของคุณ @ root ของคุณ หากสนใจตรวจสอบdeadmanssnitch.com . เครื่องมือนี้ดูเหมือนว่าจะแก้ปัญหากรณีดังกล่าว ดูเหมือนจะใช้งานง่าย - เพียงเพิ่มโค้ดที่เครื่องมือให้กับ cronjob ของคุณ หากงานของคุณล้มเหลวในการทำงานในเขตที่ระบุคุณจะได้รับการแจ้งเตือน หากงานของคุณเริ่มทำงานอีกครั้งคุณจะได้รับการแจ้งเตือนด้วย


1

ฉันใช้vixie-cronดังนั้นฉันไม่รู้ว่าสิ่งนี้ใช้ได้กับทุกสิ่งหรือไม่ แต่ฉันมีdead.letterไฟล์ที่มีเอาต์พุตทั้งหมดของงาน

ในของฉัน/root/โฟลเดอร์ฉันได้crons.cronซึ่งผมตั้งเป็น crontab crontab /root/crons.cronของฉันด้วยการวิ่ง dead.letterจะถูกสร้างขึ้นใน/root/เช่นกัน

แก้ไข ฉันแค่ใช้ Google dead.letterและเป็นอีเมลที่ไม่สามารถส่งได้ เห็นได้ชัดว่าไม่มีส่วนเกี่ยวข้องกับ cron หากคุณตั้งค่าอีเมลไม่ถูกต้อง (เช่นฉัน) คุณจะมีไฟล์


0

สำหรับมือใหม่นี่อาจเป็นความเจ็บปวดที่จะดีบั๊ก อย่าสลับค่านาทีและค่าชั่วโมง นาทีมาก่อนจากนั้นชั่วโมง เมื่อคุณให้ค่าน้อยกว่า 12 สำหรับแต่ละค่าจะยอมรับ แต่อาจไม่ทำงานตามที่คาดไว้หรือเลย


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