วิธีบันทึกงาน cron


218

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


ลองดูที่โพสต์นี้: การจัดการล็อกไฟล์ที่สร้างขึ้นโดยงาน cron
codeforester

คำตอบ:


347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

จะบันทึกผลลัพธ์ทั้งหมดจากงาน cron ไปยัง /var/log/myjob.log

คุณอาจใช้mailเพื่อส่งอีเมล ระบบส่วนใหญ่จะส่งcronงานที่ไม่ได้จัดการทางอีเมลไปที่รูทหรือผู้ใช้ที่เกี่ยวข้อง


78
คำอธิบายความหมาย2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko

5
สิ่งที่อาจเป็นปัญหาหากไฟล์บันทึกนี้ไม่เคยถูกสร้างขึ้น?
แคลมป์

10
FWIW, ถ้าคุณต้องการทั้งคู่stderrและstdoutในท่อนซุง, 2>&1ต้องมาทางอ้อม:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq

2
วิธีการแทรกYYYY-MM-DD_hh-mm-secลงในชื่อไฟล์ที่ส่งออกเพื่อให้ชื่อไฟล์ทุกคนแตกต่างกันและเก็บไว้โดยไม่ต้องเขียนใหม่?
Danijel

6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile

61

โดยค่าเริ่มต้น cron จะบันทึกลงใน / var / log / syslog เพื่อให้คุณสามารถดูรายการที่เกี่ยวข้องกับ cron ได้โดยใช้:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log


2
บน Ubuntu 12.04 ค่าเริ่มต้นจะไม่มี. log คือ / var / log / syslog
tishma

5
ใช้journalctl | grep cronกับระบบ systemd
Microsoft Linux TM

2
/var/log/cronบน AWS Linux AMI
Jonathan

2
หรือsudo journalctl -u cron
Gianfranco P.

2
ในกรณีที่cronถูกบันทึกไว้อย่างแน่นอนขึ้นอยู่กับระบบ มีคำตอบแยกต่างหากพร้อมรายละเอียดเกี่ยวกับวิธีกำหนดค่าปลายทางการบันทึกต่างๆบนระบบ Linux (หรือมากกว่านั้นอย่างถูกต้องระบบที่ใช้syslog) ระบบอื่นอาจมีวิธีอื่นในการกำหนดค่าสิ่งเหล่านี้
tripleee

10

นี่คือรหัสของฉัน:

* * * * * your_script_fullpath >> your_log_path 2>&1

">>" หมายถึงผนวกข้อมูลลงใน fileright หรือไม่ อะไรคือความหมายของ "2> & 1" เอาต์พุตเต็มโดยมีข้อผิดพลาดใช่ไหม
Nullpointer

3
คำถามการเปลี่ยนเส้นทางพื้นฐานจะตรวจสอบได้ดีที่สุดในคู่มือ นอกจากนี้ยังมีคำถามที่ซ้ำกันเกี่ยวกับตัวดำเนินการเหล่านี้ที่ Potrzebie ใน Stack Overflow แต่ใช่ลวก >>ผนวกและแจ้ง2>&1ว่าจะส่งข้อผิดพลาดมาตรฐานไปยังตำแหน่งเดียวกับเอาต์พุตมาตรฐาน
tripleee

10

มีการบันทึกอย่างน้อยสามประเภท:

  1. การบันทึกก่อนที่โปรแกรมจะทำงานซึ่งจะบันทึกหาก cronjob TRIED เพื่อรันคำสั่งเท่านั้น อันนั้นตั้งอยู่ใน / var / log / syslog ดังที่ได้กล่าวแล้วโดย @Matthew Lock

  2. การบันทึกข้อผิดพลาดหลังจากที่โปรแกรมพยายามดำเนินการซึ่งสามารถส่งไปยังอีเมลหรือไฟล์ตามที่ระบุไว้โดย @Spliffster ฉันชอบที่จะเข้าสู่ไฟล์เพราะมีอีเมลแล้วคุณมีแหล่งใหม่ของปัญหาและการตรวจสอบว่าการส่งและรับอีเมลทำงานได้อย่างสมบูรณ์ บางครั้งมันก็เป็นบางครั้งก็ไม่ได้ ตัวอย่างเช่นในเครื่องเดสก์ท็อปทั่วไปทั่วไปที่คุณไม่สนใจกำหนดค่า smtp บางครั้งคุณจะชอบการบันทึกไฟล์:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • ฉันจะพิจารณาการตรวจสอบการอนุญาตของ / ABSOLUTE_PATH_TO_LOG และเรียกใช้คำสั่งจากการอนุญาตของผู้ใช้นั้น เพียงเพื่อการตรวจสอบในขณะที่คุณทดสอบว่าอาจเป็นสาเหตุของปัญหาหรือไม่
  3. การบันทึกของโปรแกรมด้วยการจัดการข้อผิดพลาดและการบันทึกเพื่อการติดตาม

มีแหล่งที่มาทั่วไปของปัญหาเกี่ยวกับ cronjobs: * เส้นทาง ABSOLUTE ของไบนารีที่จะดำเนินการ เมื่อคุณเรียกใช้จากเชลล์อาจทำงานได้ แต่กระบวนการ cron ดูเหมือนว่าจะใช้สภาพแวดล้อมอื่นและด้วยเหตุนี้มันจะไม่ค้นหาไบนารีหากคุณไม่ใช้เส้นทางที่แน่นอน * LIBRARIES ที่ใช้โดยไบนารี มันคือจุดก่อนหน้านี้เหมือนกันมากขึ้นหรือน้อยลง แต่ให้แน่ใจว่าถ้าเพียงแค่ใส่ชื่อของคำสั่งจะอ้างถึงไบนารีที่ใช้ไลบรารีเดียวกันหรือดีกว่าให้ตรวจสอบว่าไบนารีที่คุณอ้างถึงด้วยเส้นทางที่แน่นอน เหมือนกับที่คุณอ้างถึงเมื่อคุณใช้คอนโซลโดยตรง ไบนารีสามารถพบได้โดยใช้คำสั่งค้นหาเช่น:

$locate python

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

  • แหล่งที่มาของปัญหาทั่วไปอีกอย่างคือไวยากรณ์ใน cronjob โปรดจำไว้ว่ามีอักขระพิเศษที่คุณสามารถใช้สำหรับรายการ (เครื่องหมายจุลภาค) เพื่อกำหนดช่วง (เครื่องหมายขีด -) เพื่อกำหนดส่วนเพิ่มของช่วง (เครื่องหมายทับ) ฯลฯ ดูที่: http://www.softpanorama.org/Utilities/ cron.shtml

8

บน Ubuntu คุณสามารถเปิดใช้งานcron.logไฟล์ที่มีเพียงรายการ CRON

ยกเลิกหมายเหตุบรรทัดที่กล่าวถึงcronใน /etc/rsyslog.d/50-default.confไฟล์:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

บันทึกและปิดไฟล์จากนั้นรีสตาร์ทrsyslogเซอร์วิส:

sudo systemctl restart rsyslog

ตอนนี้คุณสามารถดูรายการบันทึก cron ในไฟล์ของตนเอง:

sudo tail -f /var/log/cron.log

ตัวอย่างผลลัพธ์:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

อย่างไรก็ตามคุณจะไม่เห็นข้อมูลเพิ่มเติมเกี่ยวกับสคริปต์ที่ทำงานจริงภายใน/etc/cron.dailyหรือ/etc/cron.hourlyยกเว้นว่าสคริปต์เหล่านั้นจะส่งเอาต์พุตโดยตรงไปยัง cron.log (หรืออาจเป็นไฟล์บันทึกอื่น ๆ )

หากคุณต้องการตรวจสอบว่า crontab กำลังทำงานอยู่และไม่ต้องค้นหามันในcron.logหรือsyslogให้สร้าง crontab ที่เปลี่ยนเส้นทางผลลัพธ์ไปยังล็อกไฟล์ที่คุณเลือก - เช่น:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

ขั้นตอนที่นำมาจาก: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/


Ubuntu 16.04 ไม่ได้แสดงบันทึก cron ใด ๆ และข้อมูลนี้ได้หลอกลวง
pojda

5

cron ส่งเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานของทุกงานที่รันโดยเมลไปยังเจ้าของงาน cron แล้ว

คุณสามารถใช้MAILTO=recipientในcrontabไฟล์จะมีอีเมลที่ส่งไปยังบัญชีที่แตกต่างกัน

เพื่อให้สิ่งนี้ใช้งานได้คุณต้องให้จดหมายทำงานอย่างถูกต้อง การส่งไปยังกล่องจดหมายท้องถิ่นมักจะไม่มีปัญหา (อันที่จริงมีโอกาสที่ls -l "$MAIL"จะเปิดเผยว่าคุณได้รับบ้างแล้ว) แต่การนำออกนอกกรอบและออกสู่อินเทอร์เน็ตต้องใช้ MTA (Postfix, Sendmail, คุณมีอะไร) ได้รับการกำหนดค่าอย่างเหมาะสมเพื่อเชื่อมต่อกับโลก

หากไม่มีผลลัพธ์จะไม่มีการสร้างอีเมล

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

ในการเปลี่ยนเส้นทางสตรีมเอาต์พุตทั้งสองรูปแบบจะมีรูปแบบดังนี้

42 17 * * * script >>stdout.log 2>>stderr.log

สังเกตว่าเราผนวก (double >>) แทนการเขียนทับเพื่อให้ผลลัพธ์ของงานก่อนหน้านี้ไม่ถูกแทนที่ด้วยงานถัดไป

ตามที่แนะนำในคำตอบมากมายที่นี่คุณสามารถให้สตรีมเอาต์พุตทั้งสองถูกส่งไปยังไฟล์เดียว แทนที่การเปลี่ยนเส้นทางที่สองด้วย2>&1การพูดว่า "ข้อผิดพลาดมาตรฐานควรไปทุกที่ที่เอาต์พุตมาตรฐานกำลังดำเนินการ" (แต่ฉันไม่รับรองการฝึกฝนนี้โดยเฉพาะมันสมเหตุสมผลถ้าคุณไม่คาดหวังอะไรกับเอาต์พุตมาตรฐาน แต่อาจมองข้ามบางสิ่งบางอย่างอาจมาจากเครื่องมือภายนอกที่เรียกจากสคริปต์ของคุณ)

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

Antipattern ที่พบบ่อยคือการเปลี่ยนเส้นทางทุกอย่างไปยัง/dev/null(แล้วขอให้ Stack Overflow ช่วยคุณค้นหาสิ่งที่ผิดพลาดเมื่อบางสิ่งไม่ทำงาน แต่เราไม่เห็นผลลัพธ์ที่หายไปเช่นกัน!)

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

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

บางแพลตฟอร์ม (และเช่น GNU Awk) อนุญาตให้คุณใช้ชื่อไฟล์/dev/stderrสำหรับข้อความแสดงข้อผิดพลาด แต่ไม่สามารถพกพาได้อย่างถูกต้อง ใน Perl warnและdieพิมพ์ไปยังข้อผิดพลาดมาตรฐาน ใน Python เขียนsys.stderrหรือใช้logging; $stderr.putsในรูบีลอง โปรดสังเกตว่าข้อความข้อผิดพลาดควรมีชื่อของสคริปต์ที่สร้างข้อความวินิจฉัยอย่างไร


1

ในกรณีที่คุณใช้งานบางคำสั่งด้วย sudo มันจะไม่อนุญาต Sudo ต้องการ tty


4
นอกจากนี้ยังขึ้นอยู่กับการsudoกำหนดค่า สิ่งที่ต้องดำเนินการโดยไม่มีวิธีการจัดหารหัสผ่านควรได้รับการกำหนดค่าด้วยNOPASSWD:ในsudoersการกำหนดค่าของคุณ
tripleee

0

หากคุณยังต้องการตรวจสอบงาน cron ของคุณคุณควรระบุบัญชีอีเมลที่ถูกต้องเมื่อตั้งค่างาน Cron ใน cPanel

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

โปรดจำไว้ว่าคุณจะได้รับอีเมลสำหรับงาน cron แต่ละงาน นี่อาจทำให้กล่องขาเข้าของคุณท่วมในกรณีที่ crons ของคุณทำงานบ่อยเกินไป

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