วิธีแก้ไข crontab ที่เกี่ยวข้องกับ woes / problems (Linux) ทั้งหมดของคุณ
นี่คือวิกิชุมชนถ้าคุณสังเกตเห็นสิ่งที่ไม่ถูกต้องกับคำตอบนี้หรือมีข้อมูลเพิ่มเติมโปรดแก้ไข
ก่อนคำศัพท์พื้นฐาน:
- cron (8)เป็น daemon ที่ดำเนินการคำสั่งที่กำหนดไว้
- crontab (1)เป็นโปรแกรมที่ใช้ในการแก้ไขไฟล์ผู้ใช้ crontab (5)
- crontab (5)เป็นไฟล์สำหรับผู้ใช้ที่มีคำแนะนำสำหรับ cron (8)
ถัดไปการศึกษาเกี่ยวกับ cron:
ผู้ใช้ทุกคนในระบบอาจมีไฟล์ crontab ของตนเอง สถานที่ตั้งของรากและ crontab ใช้ไฟล์ที่มีขึ้นอยู่กับระบบ /var/spool/cron
แต่พวกเขามักจะมีดังต่อไปนี้
มี/etc/crontab
ไฟล์ทั้งระบบ/etc/cron.d
ไดเรกทอรีอาจมีชิ้นส่วน crontab ซึ่งยังอ่านและดำเนินการโดย cron ลีนุกซ์ดิสทริบิวชันบางตัว (เช่น Red Hat) ยังมี/etc/cron.{hourly,daily,weekly,monthly}
ไดเร็กตอรี่, สคริปต์ที่อยู่ข้างในซึ่งจะถูกประมวลผลทุกชั่วโมง / วัน / สัปดาห์ / เดือน, โดยมีสิทธิ์รูท
รูทสามารถใช้คำสั่ง crontab ได้ตลอดเวลา ผู้ใช้ทั่วไปอาจหรือไม่ได้รับอนุญาตให้เข้าถึง เมื่อคุณแก้ไขไฟล์ crontab ด้วยคำสั่งcrontab -e
และบันทึก crond จะตรวจสอบความถูกต้องพื้นฐาน แต่ไม่รับประกันว่าไฟล์ crontab ของคุณจะเกิดขึ้นอย่างถูกต้อง มีไฟล์ชื่อcron.deny
ซึ่งจะระบุผู้ใช้ที่ไม่สามารถใช้ cron ได้ cron.deny
ตั้งไฟล์ขึ้นอยู่กับระบบและสามารถลบซึ่งจะช่วยให้ผู้ใช้ทุกคนที่จะใช้ cron
หากคอมพิวเตอร์ไม่ได้เปิดอยู่หรือ crond daemon ไม่ได้ทำงานและวันที่ / เวลาสำหรับคำสั่งที่จะทำงานได้ผ่านไปแล้ว crond จะไม่ทำงานและเรียกใช้แบบสอบถามที่ผ่านมา
รายการ crontab, วิธีการกำหนดคำสั่ง:
คำสั่ง crontab แสดงโดยบรรทัดเดียว คุณไม่สามารถใช้\
เพื่อขยายคำสั่งผ่านหลายบรรทัด เครื่องหมาย hash ( #
) แสดงถึงความคิดเห็นซึ่งหมายความว่า cron จะไม่สนใจสิ่งใดในบรรทัดนั้น ช่องว่างนำหน้าและบรรทัดว่างจะถูกละเว้น
ระวังให้มากเมื่อใช้%
เครื่องหมายเซ็นต์( ) ในคำสั่งของคุณ เว้นแต่ว่าพวกเขาจะหลบหนี\%
พวกเขาจะถูกแปลงเป็นบรรทัดใหม่และทุกอย่างหลังจากที่ไม่มีการหลบหนีครั้งแรก%
จะถูกส่งผ่านไปยังคำสั่งของคุณใน stdin
มีสองรูปแบบสำหรับไฟล์ crontab:
ผู้ใช้ crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
ระบบกว้าง/etc/crontab
และ/etc/cron.d
ชิ้นส่วน
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed
ขอให้สังเกตว่าหลังต้องมีชื่อผู้ใช้ คำสั่งจะถูกเรียกใช้ในฐานะผู้ใช้ที่ระบุชื่อ
5 ฟิลด์แรกของบรรทัดแสดงเวลาที่ควรรันคำสั่ง คุณสามารถใช้หมายเลขหรือชื่อวัน / เดือนที่เกี่ยวข้องได้ในการระบุเวลา
- เขตข้อมูลจะถูกคั่นด้วยช่องว่างหรือแท็บ
- เครื่องหมายจุลภาค (
,
) ใช้เพื่อระบุรายการเช่น 1,4,6,8 ซึ่งหมายถึงเรียกใช้ที่ 1,4,6,8
- ช่วงจะถูกระบุด้วยเครื่องหมายขีดกลาง (
-
) และอาจรวมกับรายการเช่น 1-3,9-12 ซึ่งหมายถึงระหว่าง 1 ถึง 3 จากนั้นระหว่าง 9 ถึง 12
/
ตัวละครที่สามารถนำมาใช้ในการแนะนำขั้นตอนเช่น 2/5 ซึ่งหมายถึงการเริ่มต้นที่ 2 แล้วทุก 5 (2,7,12,17,22 ... ) พวกเขาไม่ได้พันผ่านมา
- เครื่องหมายดอกจัน (
*
) ในฟิลด์หมายถึงช่วงทั้งหมดสำหรับฟิลด์นั้น (เช่น0-59
สำหรับฟิลด์นาที)
- สามารถรวมช่วงและขั้นตอนต่างๆได้เช่น
*/2
หมายถึงการเริ่มต้นที่ต่ำสุดสำหรับฟิลด์ที่เกี่ยวข้องจากนั้นทุก ๆ 2 เช่น 0 สำหรับนาที (0,2 ... 58), 1 สำหรับเดือน (1,3 ... 11) เป็นต้น
การดีบักคำสั่ง cron
ตรวจสอบอีเมล!
โดยค่าดีฟอลต์ cron จะส่งเอาต์พุตใด ๆ จากคำสั่งไปยังผู้ใช้ที่กำลังรันคำสั่งเป็น หากไม่มีเอาต์พุตจะไม่มีเมล ถ้าคุณต้องการให้ cron ส่งเมลไปยังบัญชีอื่นคุณสามารถตั้งค่าตัวแปรสภาพแวดล้อม MAILTO ในไฟล์ crontab เช่น
MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command
จับเอาท์พุทด้วยตัวคุณเอง
คุณสามารถเปลี่ยนเส้นทาง stdout และ stderr ไปยังไฟล์ ไวยากรณ์ที่แน่นอนสำหรับการจับผลลัพธ์อาจแตกต่างกันไปขึ้นอยู่กับเชลล์ cron ที่ใช้ นี่คือตัวอย่างสองตัวอย่างที่บันทึกเอาต์พุตทั้งหมดไปยังไฟล์ที่/tmp/mycommand.log
:
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
ดูบันทึก
Cron บันทึกการกระทำของตนผ่านทาง syslog ซึ่ง (ขึ้นอยู่กับการตั้งค่าของคุณ) มักจะไปหรือ/var/log/cron
/var/log/syslog
หากจำเป็นคุณสามารถกรองคำสั่ง cron ด้วยเช่น
grep CRON /var/log/syslog
ตอนนี้เราได้ผ่านพื้นฐานของ cron แล้วไฟล์เหล่านั้นอยู่ที่ไหนและวิธีการใช้งานพวกเรามาดูปัญหาทั่วไปกันบ้าง
ตรวจสอบ cron ที่กำลังทำงานอยู่
หาก cron ไม่ทำงานคำสั่งของคุณจะไม่ถูกกำหนด ...
ps -ef | grep cron | grep -v grep
คุณควรได้รับสิ่งที่ชอบ
root 1224 1 0 Nov16 ? 00:00:03 cron
หรือ
root 2018 1 0 Nov14 ? 00:00:06 crond
ถ้าไม่รีสตาร์ท
/sbin/service cron start
หรือ
/sbin/service crond start
อาจมีวิธีอื่น ใช้สิ่งที่ distro ของคุณมอบให้
cron รันคำสั่งของคุณในสภาพแวดล้อมที่ จำกัด
ตัวแปรสภาพแวดล้อมใดที่มีอยู่มีแนวโน้มว่าจะ จำกัด มาก โดยปกติแล้วคุณจะได้รับตัวแปรไม่กี่ที่กำหนดไว้เช่น$LOGNAME
, และ$HOME
$PATH
ของโปรดโดยเฉพาะคือจะมีการPATH
จำกัด ปัญหาส่วนใหญ่ของ "สคริปต์ cron ของฉันไม่ทำงาน" เกิดจากเส้นทางที่ จำกัดนี้ หากคำสั่งของคุณอยู่ในตำแหน่งอื่นคุณสามารถแก้ปัญหานี้ได้สองวิธี:/bin:/usr/bin
ระบุเส้นทางแบบเต็มไปยังคำสั่งของคุณ
1 2 * * * /path/to/your/command
ระบุ PATH ที่เหมาะสมในไฟล์ crontab
PATH=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
หากคำสั่งของคุณต้องการตัวแปรสภาพแวดล้อมอื่น ๆ คุณสามารถกำหนดได้ในไฟล์ crontab เช่นกัน
cron รันคำสั่งของคุณด้วย cwd == $ HOME
โดยไม่คำนึงว่าโปรแกรมที่คุณดำเนินการอยู่ในระบบแฟ้ม, ไดเรกทอรีการทำงานปัจจุบันของโปรแกรมเมื่อ cron ทำงานมันจะเป็นไดเรกทอรีบ้านของผู้ใช้ หากคุณเข้าถึงไฟล์ในโปรแกรมของคุณคุณจะต้องคำนึงถึงสิ่งนี้หากคุณใช้พา ธ สัมพัทธ์หรือ (โดยเฉพาะ) ใช้เส้นทางที่ผ่านการรับรองทุกที่และช่วยให้ทุกคนสับสนมาก
คำสั่งสุดท้ายใน crontab ของฉันไม่ทำงาน
โดยทั่วไป Cron ต้องการให้คำสั่งถูกยกเลิกด้วยบรรทัดใหม่ แก้ไข crontab ของคุณ ไปที่จุดสิ้นสุดของบรรทัดที่มีคำสั่งสุดท้ายและแทรกบรรทัดใหม่ (กด Enter)
ตรวจสอบรูปแบบ crontab
คุณไม่สามารถใช้ crontab ที่จัดรูปแบบผู้ใช้สำหรับ / etc / crontab หรือแฟรกเมนต์ใน /etc/cron.d และในทางกลับกัน ผู้ใช้ที่จัดรูปแบบ crontab จะไม่มีชื่อผู้ใช้ในตำแหน่งที่ 6 ของแถวในขณะที่ระบบที่จัดรูปแบบ crontab จะมีชื่อผู้ใช้และเรียกใช้คำสั่งในฐานะผู้ใช้นั้น
ฉันใส่ไฟล์ไว้ใน /etc/cron.{hourly,daily,weekly,monthly} และมันไม่ทำงาน
- ตรวจสอบว่าชื่อไฟล์ไม่มีส่วนขยายให้ดูส่วนที่รัน
- ตรวจสอบให้แน่ใจว่าไฟล์มีสิทธิ์ดำเนินการ
- บอกระบบว่าจะใช้อะไรเมื่อเรียกใช้งานสคริปต์ของคุณ (เช่นวางไว้
#!/bin/sh
ด้านบน)
ข้อผิดพลาดที่เกี่ยวข้องกับวันที่ Cron
หากวันที่ของคุณมีการเปลี่ยนแปลงโดยผู้ใช้หรือการอัปเดตระบบเขตเวลาหรืออื่น ๆ crontab จะเริ่มทำงานผิดปกติและแสดงข้อผิดพลาดที่แปลกประหลาดบางครั้งใช้งานได้ นี่คือความพยายามของ crontab ในการพยายาม "ทำสิ่งที่คุณต้องการ" เมื่อเวลาเปลี่ยนจากด้านล่าง ฟิลด์ "นาที" จะไม่ได้ผลหลังจากเปลี่ยนชั่วโมงแล้ว ในสถานการณ์สมมตินี้จะยอมรับเฉพาะเครื่องหมายดอกจัน รีสตาร์ท cron แล้วลองอีกครั้งโดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต (ดังนั้นวันที่ไม่มีโอกาสรีเซ็ตเป็นหนึ่งในเซิร์ฟเวอร์เวลา)
เปอร์เซ็นต์สัญญาณอีกครั้ง
ในการเน้นคำแนะนำเกี่ยวกับเครื่องหมายเปอร์เซ็นต์นี่คือตัวอย่างของ cron ที่ทำกับพวกเขา:
# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz
จะสร้างไฟล์ ~ / cron.out ที่มี 3 บรรทัด
foo
bar
baz
นี่เป็นการรบกวนโดยเฉพาะอย่างยิ่งเมื่อใช้date
คำสั่ง ให้แน่ใจว่าได้หลบหนีสัญญาณร้อยละ
* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"