Предотвращение запуска второй копии процесса в cron с помощью утилиты flock

Столкнулся значит я со следующей задачей: необходимо чтобы скрипт всё время был запущенным, но вот досада — иногда он падает, причем каждый раз по каким-то новым необъяснимым причинам. Суть такова, что единичные падения совсем не критичны, главное чтобы 99% времени он был запущен. Для контроля, что скрипт запущен решено использовать cron. Но cron будет плодить бесконечное количество клонов скрипта каждую минуту, а нужен только один экземпляр.
Как же предотвратить дублирование процесса и быть уверенным, что запуск скрипта будет осуществлен только после падения предыдущего запуска? Беглый поиск показал, что с этим справится утилита flock, позволяющая блокировать запуск новых экземпляров скрипта.

Пример того, как выглядит запуск скрипта на python при использовании flock в задачах по расписанию cron:

* * * * * /usr/bin/flock -n /tmp/my.lockfile /usr/bin/python3 /path/to/script.py

при вызове надо будет указать файл блокировки, должен находится в директории с правами на запись. В некоторых руководствах советуют писать в папку /var/run но я с этим не заморачивался.

После завершений программы (или в моём случае при падении), блокировка, выставленная через файл my.lockfile, снимется и процедура может быть запущена вновь.
Параметр -n означает что flock сразу останавливает своё выполнение, если процесс блокирован.
Для Вашей настройки можете посмотреть также параметр -w (alias —wait —timeout) устанавливающий количество секунд ожидания разблокировки. Если за указанное время процесс не разблокируется, то попытка будет остановлена (exit code 1).

В конце приведу ещё один пример где может пригодиться flock: регулярная архивация файлов требует чтобы сначала завершился предыдущий запуск архиватора и только после него можно начинать вновь. Так как время на выполнении архивации заранее предугадать нельзя, то блокировка с помощью flock вполне будет уместна.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>