ฉันต้องการแก้ไขปัญหา cron ที่ทำงานได้ดีจนกระทั่งมีการแก้ไขล่าสุด แต่ฉันหาไฟล์บันทึก cron ไม่พบ
cron
งานที่ฉันตั้งไว้cron -e
และฉันสามารถเห็นมันด้วยcron -l
และฉันแน่ใจว่ามันใช้ได้กับ Lion และก่อนหน้านั้นบน Snow Leopard เป็นเวลานาน
ฉันต้องการแก้ไขปัญหา cron ที่ทำงานได้ดีจนกระทั่งมีการแก้ไขล่าสุด แต่ฉันหาไฟล์บันทึก cron ไม่พบ
cron
งานที่ฉันตั้งไว้cron -e
และฉันสามารถเห็นมันด้วยcron -l
และฉันแน่ใจว่ามันใช้ได้กับ Lion และก่อนหน้านั้นบน Snow Leopard เป็นเวลานาน
คำตอบ:
โดยค่าเริ่มต้น cron จะไม่บันทึกผลลัพธ์ของงานที่ดำเนินการ เป็นไปได้ที่จะบันทึกความจริงที่ว่า cronjobs ได้ถูกดำเนินการแล้ว แต่นั่นไม่ใช่ค่าเริ่มต้นบน OS X เช่นกัน
เพื่อตรวจสอบเอาต์พุตการประมวลผล cronjob ฉันขอแนะนำให้แก้ไขบรรทัด cronjob ของคุณเพื่อเปลี่ยนเส้นทาง STDOUT และ STDERR ไปยัง logfiles ในไฟล์ crontab ของคุณหรือหลังการรันcrontab -e
อย่างไรก็ตามคุณสามารถเพิ่มสิ่งต่อไปนี้ในสายงานของคุณ:
0 0 * * * yourcommand >/tmp/stdout.log 2>/tmp/stderr.log
การทำเช่นนี้ควรส่ง STDOUT (โดยปกติแล้วพิมพ์หรือ echo'ed เอาต์พุตไปยัง STDOUT) ไปยังไฟล์ข้อความชื่อ stdout.log ในไดเร็กทอรี / tmp และ STDERR to stderr.log ในไดเรกทอรี temp ยูทิลิตี้หลายแห่งใช้ STDERR เพื่อพิมพ์ข้อความแสดงข้อผิดพลาดพิเศษเมื่อพวกเขาเกิดข้อผิดพลาดของแอปพลิเคชันและไม่ใช่ข้อผิดพลาดที่เกิดขึ้นจากการดำเนินการตามจริงของโปรแกรม (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับSTDERRใน Wikipedia)
cron
ด้วยเหตุผลบางประการที่ล้มเหลวในการเริ่มงานตั้งแต่แรก ถ้าฉันทำงานด้วยตนเองโดยพิมพ์คำสั่งในเทอร์มินัลมันจะรันและส่งออกไปยัง logfile แต่ถ้าฉันรอcron
ให้มันทำงานไม่มีอะไรเกิดขึ้นอย่างน้อยก็ไม่มีการเปลี่ยนแปลงในไฟล์บันทึกฉันคิดว่าอาจเป็น "ไฟล์บันทึก cron "หรือมีร่องรอยใด ๆ ในคอนโซลที่จะช่วยให้ฉันค้นหาสิ่งที่เกิดขึ้นเมื่อเร็ว ๆ นี้ฉันเปลี่ยนเปลือกของฉันจากทุบตีเป็น zsh แต่ฉันไม่คิดว่าจะมีผลกระทบกับเรื่องนี้
/System/Library/LaunchDaemons/com.vix.cron.plist
) ด้วย Stdout / Stderr เพื่อแก้ปัญหา cron ได้ ฉันจำไม่ได้ว่าการlaunchctl unload
ing และlaunchctl load
ing plist นั้นเพียงพอหรือเนื่องจากเป็น daemon ของระบบหากคุณต้องเริ่มต้นใหม่ทั้งหมด ฉันอยากจะแนะนำอย่างหลังเพื่อให้แน่ใจ
ง่ายต่อการเพิ่มสิ่งต่อไปนี้ลงใน/etc/syslog.conf
:
cron.* /var/log/cron.log
จากนั้นรีสตาร์ท syslog
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
ผ่านการทดสอบและทำงานบน OSX 10.7.4
/etc/syslog.conf
# Note that flat file logs are now configured in /etc/asl.conf
ไฟล์นั้นมีรูปแบบที่แตกต่างกันฉันไม่ทราบวิธีกำหนดค่าการเข้าสู่ระบบ
ตามค่าเริ่มต้น "การบันทึก" จะไม่เปิดใช้งาน แต่คุณอาจได้รับข้อมูลที่เป็นประโยชน์โดยการเรียกใช้mail
คำสั่ง
TL; DR บนmail
คำสั่ง: กด Enter เพื่ออ่านข้อความจากนั้นq
และป้อนเพื่อออก
ฉันสามารถค้นหาการเข้าสู่ระบบงาน cron
/var/mail/{user-name}
ต่อไปนี้เป็นบันทึกการใช้งาน cron ที่ฉันได้รับสำหรับการเรียกใช้คำสั่ง AWS CLI
From build@BuildServer1.local Fri Mar 2 10:00:00 2018
Return-Path: <build@BuildServer1.local>
X-Original-To: build
Delivered-To: build@BuildServer1.local
Received: by BuildServer1.local (Postfix, from userid 501)
id A7A94296CBA3; Fri, 2 Mar 2018 10:00:00 +0100 (CET)
From: build@BuildServer1.local (Cron Daemon)
To: build@BuildServer1.local
Subject: Cron <build@BuildServer1> /app/scripts/s3-sync.sh
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=build>
X-Cron-Env: <USER=build>
X-Cron-Env: <HOME=/Users/build>
Message-Id: <20180302090000.A7A94296CBA3@BuildServer1.local>
Date: Fri, 2 Mar 2018 10:00:00 +0100 (CET)
upload: ../../app/logs/debug.log to s3://**my-s3***/app/logs/debug.log
user
เปิดออกเมื่อ cron กำลังเรียกใช้งาน (ค่ะ) ไม่ได้อยู่ใน/usr/local/bin
ฉันพบสิ่งนี้จากการลองผิดลองถูกและสร้างงานจากศูนย์จากสิ่งง่าย ๆ ที่ฉันรู้ว่าจะทำงานและค่อยๆเพิ่มสิ่งต่าง ๆ จนกระทั่งพบปัญหา PATH
เกี่ยวกับคำแนะนำและคำตอบอื่น ๆ :
ด้วยเหตุผลบางอย่าง (อย่างน้อยในเครื่องของฉันซึ่งใช้ Lion อัพเกรดจาก SnowLeopard) cron
ไม่ใช้พารามิเตอร์ที่ระบุในไฟล์ plist ที่launchd
อ่าน/System/Library/LaunchDaemons/com.vix.cron.plist
หรือ cron บน Lion ไม่เขียนอะไรเลย เพื่อ stdout หรือ stderr
โดยวิธีการที่ฉันใช้http://s3tools.org/s3cmdไปยังsync
โฟลเดอร์ที่มีที่ฝากข้อมูล Amazon S3 เป็นการสำรองข้อมูล (เช่น DropBox ดั้งเดิม)