daemon cron มีความแม่นยำเพียงใด


22

ตัวกำหนดเวลางาน cron แม่นยำจริงๆหรือไม่?

ฉันหมายถึงฉันต้องการสคริปต์เพื่อทำงานทุกคืนที่เป็นไปได้ล่าสุด แต่ก่อน 00:00 นของวันถัดไป

ฉันควรจะทำงาน cron ที่ 23.59 (หรือ 23:59 น.) แต่ระบบจะแม่นยำหรือไม่ ตั้งแต่วินาทีมีความสำคัญฉันควรกำหนดให้ cron job เป็น 23:58 หรือไม่?


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

ฉันเคยใช้ cron ใบ้ที่มีความแม่นยำ 10 นาที
joshudson

7
ความต้องการของคุณดูไม่น่าเชื่อถือสำหรับฉัน คุณจะทำอย่างไรถ้าระบบของคุณมีโหลดสูงประมาณเที่ยงคืน หากคุณไม่มีระบบ RT คุณจะไม่สามารถรับประกันสิ่งใดได้
Thomas Erker

พิจารณาว่าแม้ว่าคุณจะสามารถจัดหาเซิร์ฟเวอร์ที่พร้อมใช้งานอยู่เสมอและสามารถทำงานให้เสร็จภายในไม่กี่วินาที แต่ก็ยังมีสิ่งที่ผิดปกติอยู่ ตัวอย่างเช่นนาฬิกาของคุณอาจเริ่มล่องลอยโดยที่คุณไม่รู้ตัว นี่เป็นเรื่องที่บอบบางจริงๆและฉันเห็นด้วยกับความคิดเห็นข้างต้นที่ระบบต้องการเปลี่ยนแปลง
Chris Hayes

คำตอบ:


24

สิ่งที่ cron สามารถรับประกันได้คืองานของคุณจะเริ่มเร็วกว่าเวลาที่กำหนด (ขึ้นอยู่กับความแม่นยำของนาฬิการะบบ) แต่ไม่มีทางที่จะรับประกันใด ๆ เกี่ยวกับเวลาสิ้นสุดของงาน มันจะขึ้นอยู่กับปัจจัยหลายอย่าง:

  • โหลดเป็นระบบได้อย่างไร
  • งานทำอะไร
  • ความช้าเนื่องจากปัญหาฮาร์ดแวร์
  • ความช้าเนื่องจากปัญหาเครือข่าย (สมมติว่างานขึ้นอยู่กับระบบเครือข่าย)

คำแนะนำของฉันคือการเปลี่ยนแปลงการออกแบบของคุณเพื่อให้เวลาในการดำเนินการเสร็จสิ้นไม่เฉพาะ


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

@ MichaelKjörlingคุณควรใช้ไดเรกทอรีมากกว่าไฟล์เช่นการตรวจสอบแฟ้มแล้วสร้างมันไม่ได้เป็นอะตอม
8bittree

1
@ 8 บิตคุณสามารถใช้ฝูงได้เช่นกันถ้ามี
user9517 รองรับ GoFundMonica

1
@ MichaelKjörling แต่ทำไมต้องกังวลกับคดีที่ไม่เป็นไรเมื่อกรณีที่ถูกต้องนั้นง่ายกว่าด้วย?
8bittree

4
@ 8bittree หากคุณใช้O_CREATและตั้งO_EXCLค่าสถานะมันจะเป็น atomic ตราบใดที่ไฟล์นั้นอยู่ในระบบไฟล์โลคอล
kasperd

14

ฉันคิดว่าสิ่งนี้ขึ้นอยู่กับ cron daemon ของคุณ แต่เอกสารและมาตรฐานระบุว่าถ้าคุณระบุนาทีงานจะดำเนินการในนาทีที่ระบุ

ดู:

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


ฉันมีเซิร์ฟเวอร์เสมือนที่มีโหลดต่ำมาก แต่ cron ที่ตั้งค่าให้ทำงานทุกนาทีจะเริ่มบางครั้งที่ 0s, 1s, 2s, บางครั้งจนถึง 17s ฉันเดาว่า cron อาจมีความแม่นยำน้อยกว่าบนเซิร์ฟเวอร์เสมือนเนื่องจากกระบวนการอื่นที่อยู่นอกเซิร์ฟเวอร์นั้นอาจส่งผลต่อความพร้อมใช้งานของทรัพยากรเช่น CPU
เลียม

8

โดยปกติ cron จะเริ่มเวลา23:59:00 , สแกนไฟล์ crontab ทั้งหมดของคุณกรองผู้ที่เกี่ยวข้องสำหรับ23:59แล้วเริ่มต้น การสแกนไฟล์นี้ทำได้เร็วมากเนื่องจากมีไม่มากและทั้งหมดนั้นมีเพียงไม่กี่บรรทัด ดังนั้นโดยปกติ cronjobs เริ่มต้นที่23:59:00หรือ23:59:01 มีวิธีที่แน่นอนในการชะลอกระบวนการนี้โดยเจตนา (เพิ่มหลายล้านบรรทัดใน crontab เป็นต้น) หากระบบทำงานหนักเกินไปสิ่งนี้จะไม่ทำงานอย่างรวดเร็ว

นอกจากนี้ยังขึ้นอยู่กับการใช้งานอย่างชัดเจน

หากคุณต้องการเวลาเริ่มต้นที่แน่นอนคุณควรสร้างโปรแกรมที่หลับจนกว่าจะถึงเวลาที่ต้องการแล้วรัน (เช่นใช้c ++ 11 ) แต่ในระบบปฏิบัติการแบบเรียลไทม์สิ่งนี้ก็ไม่แน่นอน นาฬิกาของพีซีก็ไม่รู้เวลาที่แน่นอน!

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


2
ฉันเชื่อว่า crontabs นั้นถูกเก็บไว้ในหน่วยความจำ - หากคุณแก้ไขไฟล์ที่อยู่ด้านหลัง crontab โดยตรง (แทนที่จะเป็น crontab -e ซึ่งจะแจ้ง cron เมื่อเสร็จสิ้น) การเปลี่ยนแปลงจะไม่มีผล cron มีเยอะแยะของการหยุดทำงานเพื่อหางานที่กำลังจะเกิดขึ้นมันสามารถ "นอน" ได้จนกว่าวินาทีที่แน่นอนที่งานจะครบกำหนด
AMADANON Inc.

0

ขึ้นอยู่กับเวลาการเรียกใช้สคริปต์โดยรวมและความแม่นยำของเวลาเซิร์ฟเวอร์

59 23 * * * /some/script/file.sh

จะเปิดสคริปต์ของคุณตรงเวลา 23:59 แต่ถ้าคุณมีคำสั่งบางอย่างซึ่งทำงานเป็นเวลานานส่วนหนึ่งของสคริปต์อาจจะดำเนินการหลังเที่ยงคืน


ตรงเวลา 23:59 , เพื่อที่จะสามารถ 23:59:00-23:59:59?
อัล

2
คุณไม่มีวินาทีใน cron ปกติ ในการรับเพิ่มพิเศษ 59 วินาทีคุณต้องเพิ่ม 'รอ (59)' ที่ด้านบนของรหัสของคุณ
แมวของเฮนรี่

4
@AL ในทางปฏิบัติฉันเคยเห็นมันทำงานที่ xx: xx: 00 หรือ xx: xx: 01 แต่ในระบบที่มีการโหลดจำนวนมากไม่มีและไม่มีสัญญาใด ๆ
ฮอบส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.