ฉันต้องการทราบว่าฉันสามารถเห็นสิ่งที่งาน cron ทำในแต่ละการดำเนินการ ไฟล์บันทึกอยู่ที่ไหน หรือฉันจะส่งออกไปยังอีเมลของฉันได้อย่างไร ฉันได้ตั้งค่าที่อยู่อีเมลเพื่อส่งบันทึกเมื่องาน cron ทำงาน แต่ฉันยังไม่ได้รับอะไรเลย
ฉันต้องการทราบว่าฉันสามารถเห็นสิ่งที่งาน cron ทำในแต่ละการดำเนินการ ไฟล์บันทึกอยู่ที่ไหน หรือฉันจะส่งออกไปยังอีเมลของฉันได้อย่างไร ฉันได้ตั้งค่าที่อยู่อีเมลเพื่อส่งบันทึกเมื่องาน cron ทำงาน แต่ฉันยังไม่ได้รับอะไรเลย
คำตอบ:
* * * * * myjob.sh >> /var/log/myjob.log 2>&1
จะบันทึกผลลัพธ์ทั้งหมดจากงาน cron ไปยัง /var/log/myjob.log
คุณอาจใช้mail
เพื่อส่งอีเมล ระบบส่วนใหญ่จะส่งcron
งานที่ไม่ได้จัดการทางอีเมลไปที่รูทหรือผู้ใช้ที่เกี่ยวข้อง
2>&1
: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
stderr
และstdout
ในท่อนซุง, 2>&1
ต้องมาทางอ้อม:myjob.sh >> /var/log/myjob.log 2>&1
YYYY-MM-DD_hh-mm-sec
ลงในชื่อไฟล์ที่ส่งออกเพื่อให้ชื่อไฟล์ทุกคนแตกต่างกันและเก็บไว้โดยไม่ต้องเขียนใหม่?
date +\%Y\%m\%d\%H\%M\%S
-cron.log 2> & 1
โดยค่าเริ่มต้น cron จะบันทึกลงใน / var / log / syslog เพื่อให้คุณสามารถดูรายการที่เกี่ยวข้องกับ cron ได้โดยใช้:
grep CRON /var/log/syslog
journalctl | grep cron
กับระบบ systemd
/var/log/cron
บน AWS Linux AMI
sudo journalctl -u cron
cron
ถูกบันทึกไว้อย่างแน่นอนขึ้นอยู่กับระบบ มีคำตอบแยกต่างหากพร้อมรายละเอียดเกี่ยวกับวิธีกำหนดค่าปลายทางการบันทึกต่างๆบนระบบ Linux (หรือมากกว่านั้นอย่างถูกต้องระบบที่ใช้syslog
) ระบบอื่นอาจมีวิธีอื่นในการกำหนดค่าสิ่งเหล่านี้
นี่คือรหัสของฉัน:
* * * * * your_script_fullpath >> your_log_path 2>&1
>>
ผนวกและแจ้ง2>&1
ว่าจะส่งข้อผิดพลาดมาตรฐานไปยังตำแหน่งเดียวกับเอาต์พุตมาตรฐาน
มีการบันทึกอย่างน้อยสามประเภท:
การบันทึกก่อนที่โปรแกรมจะทำงานซึ่งจะบันทึกหาก cronjob TRIED เพื่อรันคำสั่งเท่านั้น อันนั้นตั้งอยู่ใน / var / log / syslog ดังที่ได้กล่าวแล้วโดย @Matthew Lock
การบันทึกข้อผิดพลาดหลังจากที่โปรแกรมพยายามดำเนินการซึ่งสามารถส่งไปยังอีเมลหรือไฟล์ตามที่ระบุไว้โดย @Spliffster ฉันชอบที่จะเข้าสู่ไฟล์เพราะมีอีเมลแล้วคุณมีแหล่งใหม่ของปัญหาและการตรวจสอบว่าการส่งและรับอีเมลทำงานได้อย่างสมบูรณ์ บางครั้งมันก็เป็นบางครั้งก็ไม่ได้ ตัวอย่างเช่นในเครื่องเดสก์ท็อปทั่วไปทั่วไปที่คุณไม่สนใจกำหนดค่า smtp บางครั้งคุณจะชอบการบันทึกไฟล์:
* * * * COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
มีแหล่งที่มาทั่วไปของปัญหาเกี่ยวกับ cronjobs: * เส้นทาง ABSOLUTE ของไบนารีที่จะดำเนินการ เมื่อคุณเรียกใช้จากเชลล์อาจทำงานได้ แต่กระบวนการ cron ดูเหมือนว่าจะใช้สภาพแวดล้อมอื่นและด้วยเหตุนี้มันจะไม่ค้นหาไบนารีหากคุณไม่ใช้เส้นทางที่แน่นอน * LIBRARIES ที่ใช้โดยไบนารี มันคือจุดก่อนหน้านี้เหมือนกันมากขึ้นหรือน้อยลง แต่ให้แน่ใจว่าถ้าเพียงแค่ใส่ชื่อของคำสั่งจะอ้างถึงไบนารีที่ใช้ไลบรารีเดียวกันหรือดีกว่าให้ตรวจสอบว่าไบนารีที่คุณอ้างถึงด้วยเส้นทางที่แน่นอน เหมือนกับที่คุณอ้างถึงเมื่อคุณใช้คอนโซลโดยตรง ไบนารีสามารถพบได้โดยใช้คำสั่งค้นหาเช่น:
$locate python
ตรวจสอบให้แน่ใจว่าไบนารีที่คุณจะอ้างถึงเป็นไบนารีที่คุณโทรหาในเชลล์ของคุณหรือเพียงแค่ทดสอบอีกครั้งในเชลล์โดยใช้พา ธ สัมบูรณ์ที่คุณวางแผนจะใส่ลงใน cronjob
บน 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/
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
ในรูบีลอง โปรดสังเกตว่าข้อความข้อผิดพลาดควรมีชื่อของสคริปต์ที่สร้างข้อความวินิจฉัยอย่างไร
ในกรณีที่คุณใช้งานบางคำสั่งด้วย sudo มันจะไม่อนุญาต Sudo ต้องการ tty
sudo
กำหนดค่า สิ่งที่ต้องดำเนินการโดยไม่มีวิธีการจัดหารหัสผ่านควรได้รับการกำหนดค่าด้วยNOPASSWD:
ในsudoers
การกำหนดค่าของคุณ
หากคุณยังต้องการตรวจสอบงาน cron ของคุณคุณควรระบุบัญชีอีเมลที่ถูกต้องเมื่อตั้งค่างาน Cron ใน cPanel
เมื่อคุณระบุอีเมลที่ถูกต้องคุณจะได้รับผลลัพธ์ของงาน cron ที่ดำเนินการ ดังนั้นคุณจะสามารถตรวจสอบได้และทำให้แน่ใจว่าทุกอย่างถูกดำเนินการอย่างถูกต้อง โปรดทราบว่าคุณจะไม่ได้รับอีเมลหากไม่มีเอาต์พุตจากคำสั่ง cron job
โปรดจำไว้ว่าคุณจะได้รับอีเมลสำหรับงาน cron แต่ละงาน นี่อาจทำให้กล่องขาเข้าของคุณท่วมในกรณีที่ crons ของคุณทำงานบ่อยเกินไป