cron อย่างน้อยมั่นใจได้เพียงตัวอย่างเดียว


9

มีวิธีการเรียกใช้สคริปต์ทุกนาที (หรือ 2 หรือ 5 หรืออื่น ๆ ) แต่ถ้ามันไม่ได้ทำงานอยู่แล้ว?

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

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

เราสามารถเขียนผู้จัดการเล็ก ๆ ของเราเอง แต่ฉันสงสัยว่ามีวิธีการแก้ปัญหาที่ทันสมัยมากขึ้นที่มีอยู่แล้ว


+1 ฉันก็สนใจสิ่งนี้เช่นกัน ฉันไม่ทราบคำตอบ แต่ฉันสนใจวิธีแก้ไขที่เป็นไปได้
Saif Bechan

cron เล็ก ๆ มีกลิ่นมาก "ทำให้ฉันเป็นภูต"
AD7six

คำตอบ:


9

วิธีที่ดีกว่าคือใช้flockแทน pidfile ตรวจสอบ manpage: ฝูง (1) ข้อดีคือไม่ว่ากระบวนการจะเสร็จสิ้น / ตายอย่างไรล็อคก็หายไป


3

ฉันมักจะเห็นด้วยกับคำตอบไฟล์ pid ของ Warner อย่างไรก็ตามคุณสมบัติต่อไปนี้ของ Anacron ทำให้สำเร็จหรือไม่

-s
    Serialize execution of jobs. Anacron will not start a new job before the previous one finished. 

ฉันยังไม่ได้ทดสอบด้วยตัวเองฉันไม่พบเอกสารของ anacron อย่างละเอียดพอ ...

ถ้าคุณต้องการที่จะขี้เกียจโดยเฉพาะ ;-) คุณสามารถออกจากสคริปต์ได้หาก greping ผ่านเอาต์พุต ps ส่งคืนกระบวนการที่กำลังทำงานอยู่ แต่ไฟล์ล็อค / pid นั้นดีที่สุด


anacron เป็นรุ่นล่าสุดของ cron ดังนั้นมันจึงมีคุณสมบัติมากกว่ามาตรฐานเดิม เกี่ยวกับ 'วิธี' ก็อาจลงทะเบียนตัวจัดการ SIGCHLD ซึ่งจะถูกเรียกเมื่อกระบวนการเด็กตาย ดังนั้นจึงสามารถติดตามการทำงานของเด็กและเพียงแค่ข้ามงานเหล่านั้น
Javier

@ Javier: ฉันไม่เห็นด้วยกับ "anacron เป็นรุ่นล่าสุดของ cron ดังนั้นมันจึงมีคุณสมบัติมากกว่ามาตรฐานเดิม" มีบางส่วนทับซ้อนระหว่างสิ่งที่เป็นanacronและcronทำ แต่พวกเขาแก้ปัญหาที่แตกต่างกัน การใช้cronงานคุณจะเริ่มงานที่พลาดเพราะเครื่องจักรหยุดทำงานอย่างไร ใช้anacronงานอย่างไรคุณจะเริ่มงานทุกวันที่ 25 ธันวาคมหรือทุกๆ 5 นาที (แน่นอนคุณสามารถแก้ไขสคริปต์ได้ แต่นั่นไม่ใช่สิ่งที่ฉันกำลังพูดถึง)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@Kyle: ตัวเลือกนั้นทำให้งานต่าง ๆ ถูกกำหนดเวลาให้ทำงานในเวลาเดียวกันเพื่อทำงานทีละงาน มันอาจใช้งานได้สำหรับความต้องการของ OP แต่มันจะปิดกั้นงานอื่น ๆ หรืองานอื่น ๆ จะปิดกั้นมัน นอกจากนี้anacronจะไม่ทำงานในช่วงเวลาที่สั้นกว่าหนึ่งวัน
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@Dennis Williamson: ฉันเดาว่าคุณพูดถูกฉันยังไม่ได้ตรวจสอบรายละเอียดประวัติ แต่ฉันก็ยังคงเดาว่าคุณจะเห็นด้วยว่าโครงการ anacron เริ่มต้นหลังจาก cron ได้รับการยอมรับแล้วและได้รับแรงบันดาลใจจากมัน ดังนั้นจึงไม่น่าแปลกใจที่มีคุณสมบัติที่ cron ไม่ นอกจากนี้คำถามเดิมเกี่ยวกับ cron
Javier

1

นั่นเป็นทางออกที่เหมาะสมสำหรับวิธีการนั้น โดยทั่วไปแล้วไฟล์ pid จะถูกนำมาใช้และการทดสอบ pid จะทำกับกระบวนการเพื่อประกันว่ามันกำลังทำงานอยู่ ถ้าค้างไว้ lockfile จะถูกลบออกและกระบวนการจะทำงานต่อไป

โดยทั่วไปแล้วจะมีการเขียนข่าวกรองเพิ่มเติมในซอฟต์แวร์เป็น daemon ซึ่งต่างจากการทำงานใน cron


1

หากสคริปต์ของคุณเขียนด้วยภาษาที่สนับสนุน flock (2) syscall คุณก็สามารถ flock () ไฟล์ล็อคด้วยการเรียกใช้ฟังก์ชันได้เช่นกัน ตัวอย่าง:

หากคุณติดอยู่กับ Bash หรือภาษาสคริปต์อื่น ๆ ที่ไม่สนับสนุนสิ่งนี้โซลูชันที่เสนอแล้วที่มีflock (1)ก็ใช้ได้เช่นกัน

ป.ล. ไม่ว่าในกรณีใดคุณควรสร้างไฟล์ล็อคแยกต่างหากเพียงครั้งเดียว (หากยังไม่มีไฟล์) และไม่ควรลบทิ้ง ไดเรกทอรี "/ var / lock" เป็นสถานที่ที่ดีสำหรับไฟล์ดังกล่าว


0

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

ติดตั้งด้วย: pip install quicklock

การใช้มันง่ายมาก:

[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> # Let's create a lock so that only one instance of a script will run
...
>>> singleton('hello world')
>>>
>>> # Let's try to do that again, this should fail
...
>>> singleton('hello world')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/nate/live/gallery/env/lib/python2.7/site-packages/quicklock/quicklock.py", line 47, in singleton
    raise RuntimeError('Resource <{}> is currently locked by <Process {}: "{}">'.format(resource, other_process.pid, other_process.name()))
RuntimeError: Resource <hello world> is currently locked by <Process 24801: "python">
>>>
>>> # But if we quit this process, we release the lock automatically
...
>>> ^D
[nate@Nates-MacBook-Pro-3 ~/live] python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from quicklock import singleton
>>> singleton('hello world')
>>>
>>> # No exception was thrown, we own 'hello world'!

ดู: https://pypi.python.org/pypi/quicklock

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