รันงาน cron หลายงานโดยที่งานเดียวใช้เวลานาน


16

ฉันมีคำถามทั่วไปเกี่ยวกับงาน cron

สมมติว่าฉันมีต่อไปนี้ในของฉันcrontab:

* 10 * * * * someScript.sh
* 11 * * * * someScript2.sh
30 11 */2 * * someScript3.sh  <-- Takes a long time let's say 36 hours.
* 12 * * * someScript4.sh

มันฉลาดพอที่จะทำงานที่เหลือตามเวลาที่เหมาะสมหรือไม่? ตัวอย่างเช่นสคริปต์แบบยาวไม่จำเป็นต้องยกเลิก

นอกจากนี้จะเกิดอะไรขึ้นถ้าสคริปต์ยาวเริ่มต้นยังคงทำงานอยู่และจะถูกเรียกโดย cron อีกครั้ง

ขอขอบคุณ!


Cron ไม่สนใจว่างานจะนานแค่ไหน มันจะเรียกใช้สำเนาเพิ่มเติม
Jeff Schaller

โปรดตรวจสอบว่าคำถามของคุณอยู่ในรูปแบบที่ถูกต้อง
Bram

คำตอบ:


31

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

หากสคริปต์ใด ๆ ของคุณยังคงทำงานอยู่ในช่วงเวลา cron ถัดไปของพวกเขาสคริปต์อื่นของคุณจะทำงานพร้อมกัน

สิ่งนี้อาจส่งผลที่ไม่คาดคิดขึ้นอยู่กับสิ่งที่สคริปต์ของคุณทำ ฉันจะขอแนะนำให้อ่านบทความวิกิพีเดียไฟล์ล็อคโดยเฉพาะส่วนที่เกี่ยวกับไฟล์ล็อค ไฟล์ล็อคเป็นกลไกง่าย ๆ ในการส่งสัญญาณว่าทรัพยากร - ในกรณีของคุณsomeScript3.shสคริปต์ - กำลัง 'ถูกล็อก' (เช่นกำลังใช้งานอยู่) และไม่ควรถูกดำเนินการอีกครั้งจนกว่าไฟล์ล็อคจะถูกลบออก

ดูคำตอบของคำถามต่อไปนี้เพื่อดูรายละเอียดวิธีการใช้ไฟล์ล็อคในสคริปต์ของคุณ:


8

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

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

มีข้อ จำกัด ที่ชัดเจนเกี่ยวกับปริมาณของกระบวนการที่สามารถทำงานแบบขนานได้ แต่ไม่ได้ระบุ cron


6

นอกเหนือจากคำตอบอื่น ๆ โดยเฉพาะลิงก์ที่โพสต์โดย @soulcake: หากคุณกำหนดเวลาคำสั่งที่ใช้เวลานานด้วยช่วงเวลาที่สั้นเกินไป cron จะรันวินาทีอย่างมีความสุขก่อนที่คำสั่งแรกจะเสร็จสมบูรณ์ .

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

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

10 * * * * pgrep my_slow_command >/dev/null || /usr/local/bin/my_slow_command

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

10 * * * * pgrep -f my_script.py || /usr/local/bin/my_script.py

(pgrep ไม่มีตัวเลือก '-f' ตรงกับชื่อสคริปต์ทุบตี)

หากคุณไม่สามารถใช้ pgrep ได้ด้วยเหตุผลบางประการ:

10 * * * * ps ax | grep [m]y_command || /usr/local/bin/my_command

วงเล็บถูกใช้เพื่อหลีกเลี่ยงการจับคู่คำสั่ง grep เอง


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