Столкнулся значит я со следующей задачей: необходимо чтобы скрипт всё время был запущенным, но вот досада — иногда он падает, причем каждый раз по каким-то новым необъяснимым причинам. Суть такова, что единичные падения совсем не критичны, главное чтобы 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 вполне будет уместна.