Хвилинний крон, забезпечуючи лише один екземпляр


9

Чи є спосіб запускати сценарій щохвилини (або 2, або 5, і т. Д.), Але тільки якщо він ще не працює?

У нас є набір сценаріїв, які потрібно виконувати щохвилини. Іноді вони можуть початись і закінчити через секунду, інший раз вони можуть тривати протягом 5 хвилин.

Наш сучасний спосіб уникнути одночасних виконання - встановити is_runningпрапор у кожному сценарії та вийти, якщо він все ще включений. Але це трохи ненадійно (тобто фатальні помилки можуть призвести до того, що прапор залишиться увімкненим навіть після зупинки сценарію).

Ми могли б написати свого маленького менеджера, але мені цікаво, чи існує більш модне рішення, яке вже існує.


+1 Мене теж цікавить це. Я не знаю відповіді, проте мене цікавлять можливі рішення.
Сайф Бечан

Хвилинний крон пахне сильно "зроби мене демоном"
AD7six

Відповіді:


9

кращий спосіб - використовувати flockзамість pidfile. перевірити manpage: flock (1) . Перевага полягає в тому, що незалежно від того, яким чином процес закінчується / відмирає, замок з ним втрачається.


3

Я схильний би погодитися з відповіддю на пид файл Warner. Однак чи забезпечує це наступна особливість Анакрона?

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

Я сам цього не перевіряв, не знаходжу документацію анакрона досить ретельно ...

Якщо ви хочете бути особливо ледачим ;-) Ви можете просто вийти зі сценарію, якщо прошивання через вихід PS поверне процес як запущений. Але найкраще блокувати / підписати файл.


anacron є більш новітньою версією cron, тому він має більше функцій, ніж старий стандарт. про "як" він, ймовірно, реєструє обробник SIGCHLD, який спрацьовує, коли дочірній процес помирає. таким чином він може відслідковувати запущених дітей і просто пропускати ці завдання.
Хав'єр

@ Хав'єр: Я не погоджуюсь з тим, що "анакрон - це більш нова версія версії cron, тому вона має більше функцій, ніж старий стандарт". Між тим, що anacronі що cronробити, існує певне перекриття , але вони вирішують різні проблеми. Використовуючи cron, як би ви почали роботу, яка була пропущена через відсутність машини? Використовуючи anacron, як би ви почали роботу кожні 25 грудня чи кожні 5 хвилин? (Ви, звичайно, можете обходити сценарій, але це не те, про що я говорю.)
Призупинено до подальшого повідомлення.

@Kyle: Цей параметр спричиняє виконання різних завдань, призначених для одночасного запуску по одному. Це може працювати на потреби ОП, але блокує інші робочі місця або інші робочі місця заблокують його. Крім того, anacronне працює в періоди, менші за день.
Призупинено до подальшого повідомлення.

@ Деніс Вільямсон: Я думаю, ти маєш рацію, я не перевіряв деталі історії. Але все-таки я здогадуюсь, що ти погодишся з тим, що проект анакрона розпочався після того, як Cron в значній мірі був створений і натхнений ним; тому це не дивно, що у нього є особливості, яких у крона немає. Також оригінальне запитання стосувалося cron
Хав'єра

1

Це правильне рішення для такого підходу. Як правило, буде використовуватися pid-файл, і буде проведено тест pid щодо процесу, щоб переконатися, що він працює. Якщо застарілий, файл блокування буде видалено і процес все одно запуститься.

Будь-яка додаткова розвідка, як правило, записується в самому програмному забезпеченні, як демон, на відміну від запуску в cron.


1

Якщо ваші сценарії кодуються мовою, яка підтримує системну виклик flock (2), то ви можете flock () файл блокування з викликом функції також. Приклад:

Якщо ви застрягли в Bash або іншій мові сценаріїв, яка це не підтримує, то вже запропоноване рішення з flock (1) теж чудово.

PS У будь-якому випадку вам слід створити окремий файл блокування лише один раз (якщо він ще не існує), і ніколи його не видаляти. Каталог "/ var / lock" є хорошим місцем для таких файлів.


0

Це рішення, якщо ваш скрипт працює в python (або ви можете створити команду python для запуску до наступної команди) - я зіткнувся з цією точною проблемою минулого тижня, і хоча я знайшов хороші рішення, я вирішив зробити дуже простий і чистий пакет 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.