У cron есть суперсила: он запускает задачи по расписанию. И есть скрытая пассивка: ему всё равно, что прошлый запуск ещё не закончился. Так рождаются классические баги: двойная чистка, двойная рассылка, два бэкапа в один файл, гонки за локи в БД.
Мастхев-решение
Запускать только один экземпляр, остальные попытки пропускать:
* * * * * flock -n /tmp/myjob.lock -c '/usr/local/bin/myjob.sh'
-n значит не ждать, если занято, сразу выйти.
Если важно не пропустить, а выполнить по очереди
Ждать пока освободится лок:
flock /tmp/myjob.lock -c '/usr/local/bin/myjob.sh'
Или ждать максимум 30 секунд:
flock -w 30 /tmp/myjob.lock -c '/usr/local/bin/myjob.sh'
Чтобы было видно пропуск
flock -n /tmp/cleanup.lock -c '/usr/local/bin/cleanup.sh' || logger -t cleanup "skip: lock busy"
Вывод:
flock это ремень безопасности для cron. Одной строкой ты убираешь параллельные запуски, гонки и случайную порчу данных.
LinuxCamp | #utils
