Есть ли способ запускать скрипт каждую минуту (или 2, или 5 и т. Д.), Но только если он еще не запущен?
У нас есть набор скриптов, которые нужно запускать каждую минуту. Иногда они могут начинаться и заканчиваться через секунду, в других случаях они могут продолжаться в течение 5 минут.
Наш текущий способ избежать одновременного выполнения - установить is_running
флаг в каждом скрипте и выйти, если он все еще включен. Но это немного ненадежно (т.е. фатальные ошибки могут привести к тому, что флаг останется включенным даже после остановки скрипта).
Мы могли бы написать нашего собственного маленького менеджера, но мне интересно, есть ли более модное решение, которое уже существует.
Ответы:
лучший способ - использовать
flock
вместо pidfile. проверьте справочную страницу: flock (1) . Преимущество состоит в том, что независимо от того, как процесс завершается / умирает, блокировка исчезает вместе с ним.источник
Я бы предпочел согласиться с ответом файла pid Уорнера. Однако достигает ли следующая особенность Anacron этого?
Я не проверял это сам, я не нахожу документацию Anacron достаточно тщательно ...
Если вы хотите быть особенно ленивым ;-) Вы можете просто выйти из скрипта, если grepe через вывод ps вернет процесс как работающий. Но файл блокировки / pid лучше.
источник
anacron
иcron
есть, есть некоторое совпадение , но они решают разные проблемы. Используяcron
, как бы вы начали работу, которая была пропущена, потому что машина не работала? Используяanacron
, как бы вы начать работу каждый 25 декабря или через каждые 5 минут? (Можно, конечно, обойти сценарий, но я не об этом.)anacron
не работает в периоды короче, чем день.Это правильное решение для этого подхода. Как правило, файл pid будет использоваться, и pid тест будет проводиться против процесса, чтобы убедиться, что он работает. Если он устарел, файл блокировки будет удален, и процесс все равно будет запущен.
Любой дополнительный интеллект обычно записывается в самом программном обеспечении как демон, а не в cron.
источник
Если ваши скрипты написаны на языке, который поддерживает системный вызов flock (2), то вы можете flock () заблокировать файл также с помощью вызова функции. Пример:
Если вы застряли в Bash или другом языке сценариев, который этого не поддерживает, то уже предложенное решение с flock (1) тоже подойдет.
PS В любом случае вы должны создать отдельный файл блокировки только один раз (если он еще не существует) и никогда не удалять его. Каталог "/ var / lock" является хорошим местом для таких файлов.
источник
Это решение, если ваш скрипт выполняется на python (или вы можете создать команду python для запуска перед следующей командой) - я столкнулся с этой проблемой на прошлой неделе, и хотя я нашел несколько хороших решений, я решил сделать очень простой и чистый пакет Python и загрузил его в PyPI. Конечно, вы можете заблокировать,
__file__
чтобы не думать о присвоении ему имени ресурса для блокировки.Установить с помощью:
pip install quicklock
Используя это чрезвычайно просто:
Взглянуть: https://pypi.python.org/pypi/quicklock
источник