วิธีการป้องกัน cron จากการประทับตรา?


13

บอกว่าฉันมีสคริปต์ cron หลายตัวที่ต้องทำงานทุก ๆ 15 นาที ฉันสามารถตั้งให้มันวิ่งได้*/15 * * * *แต่แล้วพวกมันก็วิ่งไปพร้อมกัน ดูเหมือนว่าโง่สำหรับเซิร์ฟเวอร์ที่จะไม่ได้ใช้งานเป็นเวลาหลายนาทีจากนั้นก็พยายามรันสคริปต์หลายสิบรายการพร้อมกัน

มีวิธีที่ฉันสามารถเรียกใช้หนึ่งสคริปต์ในนาทีที่ 1, 16, 31, 46 และอื่น ๆ ที่ 2, 17, 32, 47?

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

คำตอบ:


7

คุณกำลังทำสิ่งนี้ยากกว่าที่ควรจะเป็น วางทั้งหมดในบรรทัดเดียวกันคั่นด้วยเครื่องหมายอัฒภาค:

*/15 * * * * command1 ; command 2 ; command 3

มันจะทำงานcommand1รอให้เสร็จแล้วเรียกใช้command2รอให้เสร็จและต่อไป


15

หากคุณทำให้งาน cron ของคุณเป็นแบบนี้6-59/15 * * * *มันจะทำงานที่ 6, 21, 36 และ 51 นาทีที่ผ่านมา

สิ่งนี้อาจไม่สามารถใช้ได้กับ cron ทุกรุ่น


14

คุณสามารถใส่สคริปต์ทั้งหมดลงในไดเรกทอรีพูด/etc/cron.15mแล้วมี cron run

*/15 * * * * run-parts /etc/cron.15m

นั่นคือสมมติว่าคุณมีrun-partsคำสั่ง มันมีอยู่ในระบบที่ใช้เดเบียนทั้งหมดเป็นอย่างน้อย มันรันโปรแกรมที่ปฏิบัติการได้ทั้งหมดในไดเร็กตอรี่ที่กำหนดชื่อทีละรายการตามลำดับรายการ

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


run-partsมีอยู่ในระบบ Fedora / Red Hat ด้วย
mattdm

9

วิธีที่ตรงไปตรงมาที่สุดในการทำเช่นนี้คือเพียงตั้งค่าคำสั่งให้ทำงานด้วยตนเองเมื่อคุณต้องการ:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

หรือคุณสามารถเขียนสคริปต์เพื่อสร้างรายการ crontab ที่เหมาะสมโดยอัตโนมัติ (ซึ่งหลีกเลี่ยงการพิมพ์ผิด)

cron บางรุ่น (อาจรวมถึงที่คุณใช้อยู่) ยอมรับไวยากรณ์เพิ่มเติม:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14

0

Cron ไม่ค่อยดีในสิ่งที่คุณพยายามจะทำ คุณได้พิจารณาการเขียนสคริปต์ที่ทำหน้าที่เป็นภูตที่โดยทั่วไปจะใช้เวลา 15 นาทีดำเนินการคำสั่งแล้ววนซ้ำหรือไม่?


1
มีปัญหาที่อาจเกิดขึ้นสองสามข้อ หนึ่งคือถ้าคุณทำsleep 300ระหว่างการดำเนินการแต่ละคำสั่งการดำเนินการของคำสั่งจะทำให้เวลาในการดริฟท์; มันอาจทำงานทุก 15:10 มากกว่าทุก ๆ 15:00 และหากกระบวนการพื้นหลังตายหรือระบบรีบูตเครื่องcrondจะไม่รีสตาร์ทโดยอัตโนมัติ มีวิธีในการ "daemonize" กระบวนการพื้นหลัง แต่แล้วคุณก็ค่อนข้างจะนำมาใช้crondใหม่
Keith Thompson

ใช่ฉันเห็นด้วยว่ามันไม่ใช่ทางแก้ปัญหาที่สมบูรณ์แบบ (แม้ว่าคุณจะสามารถทำงานด้วย &) แต่ก็ไปได้
Matt Simmons

1
แต่ให้ cron รันสคริปต์เดียวที่รันคำสั่งทั้งหมดของคุณแทน ในความเป็นจริงมันเป็นความต้องการทั่วไปที่มีสคริปต์มาตรฐานที่เรียกrun-partsว่ามาพร้อมกับการติดตั้ง cron ส่วนใหญ่ที่จะทำเฉพาะที่ ดูคำตอบของ @ AndrewSchulman
tylerl

0

ดิสทริบิวชันจำนวนมากมี /etc/cron.d/cronhourly ซึ่งสคริปต์ทั้งหมดจะทำงานภายในหนึ่งชั่วโมง คุณสามารถระบุลำดับโดยเริ่มต้นด้วยหมายเลขต่อเนื่อง lik 01scriptA 02scriptB - มันควรจะมีความรู้ cron เล็กน้อยคุณต้องผลิต "cronhourlybyfour" ในขณะที่เราเรียกมันบนฐานลินุกซ์ของ Smoothwall :)

คำเตือน: นี่ใช้ส่วนทำงานตามที่แนะนำก่อนหน้านี้และส่วนทำงานไม่ชอบสคริปต์ที่มี ในชื่อดังนั้นอย่าเรียกมันว่า "deletehomefolders.sh" เรียกมันว่า "01deletehomefolders" และให้แน่ใจว่าคุณเริ่มต้นด้วย # ขวา! บรรทัดสำหรับสิ่งที่คุณตั้งใจจะตีความสคริปต์ของคุณ

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