Crond ชดเชยห้านาที


22

เป็นไปได้ไหมที่จะออฟเซ็ตสคริปต์ cron เพื่อให้ทำงานทุกๆ 5 นาที?

ฉันมีสองสคริปต์สคริปต์ 1 รวบรวมข้อมูลบางส่วนจากฐานข้อมูลหนึ่งและแทรกเข้าไปอีกสคริปต์ 2 ดึงข้อมูลนี้และข้อมูลอื่น ๆ อีกมากมายและสร้างรายงานสวย ๆ จากมัน สคริปต์ทั้งสองต้องทำงานทุก 5 นาที ฉันต้องการออฟเซ็ตสคริปต์ 2 ภายในหนึ่งนาทีเพื่อให้สามารถสร้างรายงานจากข้อมูลใหม่ EG ฉันต้องการสคริปต์หนึ่งทำงาน:00, :05, :10, :15 [...]และสคริปต์สองทำงาน:01, :06, :11, :16 [...]ทุกชั่วโมง สคริปต์ไม่ได้ขึ้นอยู่กับแต่ละอื่น ๆ และสคริปต์ 2 จะต้องรันโดยไม่คำนึงว่าสคริปต์ตัวใดประสบความสำเร็จหรือไม่ แต่มันจะมีประโยชน์ถ้ารายงานอาจมีข้อมูลล่าสุดของ hte เป็นไปได้ด้วย cron?

โพสต์;
ฉันคิดเกี่ยวกับการใช้ทั้งสองคำสั่งในเชลล์สคริปต์เพื่อให้พวกเขาทำงานได้ทันที แต่สิ่งนี้ไม่ได้ผลบางครั้งสคริปต์ 1 สามารถหยุดรอการรอ API ภายนอก ฯลฯ ดังนั้นอาจใช้เวลานานถึง 15 นาทีในการทำงาน แต่ สคริปต์ 2 ต้องทำงานทุก 5 นาทีดังนั้นการทำเช่นนี้จะหยุด / ชะลอการเรียกใช้งานสคริปต์ 2 หากฉันสามารถตั้งค่านี้ใน Cron หมายความว่าสคริปต์ 2 จะทำงานโดยไม่คำนึงถึงสิ่งที่สคริปต์ 1 กำลังทำอยู่

คำตอบ:


14

cronคุณสามารถเรียกใช้สคริปต์เมื่อใดก็ตามที่คุณต้องการใช้ หากคุณต้องการเรียกใช้สคริปต์ 1 ทุก 5 นาทีคุณอาจเริ่มต้นดังนี้:

*/5 * * * * /path/to/script1

แต่นี่เป็นการจดชวเลขเพียง:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

หากคุณต้องการเรียกใช้สคริปต์ 2 หนึ่งนาทีหลังจากสคริปต์ 1 คุณสามารถทำได้:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

คุณสามารถทำสิ่งนี้:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

จากนั้นเมื่อเริ่มต้นสคริปต์ 2 ให้นอนหลับหนึ่งนาที:

sleep 60

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

39

ฟิลด์รายการนาทีสำหรับ crontab ยอมรับโอเปอเรเตอร์ "increments of" ที่ค่อนข้างสับสนเพราะดูเหมือนว่ามันควรจะเป็นโอเปอเรเตอร์ "หารด้วย" ทางคณิตศาสตร์ แต่ไม่ใช่ คุณมักจะเห็นมันใช้สิ่งต่อไปนี้ โปรดทราบว่านี่จะไม่ค้นหาตัวเลขที่หารด้วยห้าได้ แต่จะนำทุกรายการที่ห้าจากชุด:

 */5 * * * * command

สิ่งนี้บอกให้ cron จับคู่ทุก ๆ ห้ารายการ ( /5) จากชุดนาที 0-59 ( *) แต่คุณสามารถเปลี่ยนชุดดังนี้:

 1-59/5 * * * * command

สิ่งนี้จะใช้ทุก ๆ ห้ารายการจากชุด 1-59 รันคำสั่งของคุณในนาทีที่ 6, 11, 16 เป็นต้น

หากคุณต้องการ offsets ละเอียดมากกว่าหนึ่งนาทีคุณสามารถแฮ็คมันโดยใช้คำสั่ง sleep เป็นส่วนหนึ่งของ crontab ของคุณดังนี้:

 */5 * * * * sleep 15 && command

สิ่งนี้จะเรียกใช้งานของคุณทุก ๆ ห้านาที แต่คำสั่งจะไม่เริ่มจนกว่า 15 วินาทีหลังจากนาที สำหรับงานที่ใช้เวลาสั้น ๆ ซึ่งมีเวลาอีกไม่กี่วินาทีหลังจากที่บางอย่างสร้างความแตกต่างได้ แต่คุณไม่ต้องการที่จะมาสายเต็มนี่เป็นแฮ็คที่ง่ายพอ


1
นี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับ การตั้งค่าชดเชยผ่านช่วงนั้นสะอาดกว่าการนอนหลับมาก
ND Geek

11

คุณสามารถระบุเวลาชดเชยด้วยสัญลักษณ์ + ตัวอย่างเช่นหากต้องการทำงาน:01, :06, :11, :16 [...]ให้สร้างงานเช่น

*/5+1 * * * * command

7
ดูเหมือนจะไม่สามารถใช้งานได้ใน cron บางรุ่น
jhoff

1
คุณใช้ cron เวอร์ชันใดที่สนับสนุนไวยากรณ์นี้ Cronie ดูเหมือนจะไม่สนับสนุน
Matthew G

ฉันมี Cronie บน CentOS7 ดังนั้นฉันจะไม่ลองวิธีนี้ก่อน
AnneTheAgile

1

สิ่งนี้ใช้ได้กับฉัน:

1/5 * ? * * *

โดยที่ 1 คือนาทีชดเชย ดังนั้นหากคุณต้องการชดเชยสามนาที:

3/5 * ? * * *

ฉันใช้การตั้งค่ากำหนดการ AWS ได้

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