Иногда скрипт запускается по расписанию, но предыдущий запуск ещё не закончился. Например, backup, импорт данных, rsync или очистка логов могут выполняться дольше обычного.
Обычный cron выглядит так:
* * * * * /opt/jobs/backup.sh
Если backup занимает больше минуты, следующий запуск начнётся параллельно:
backup.sh
backup.sh
backup.sh
Это может привести к битым архивам, двойной нагрузке, конфликтам файлов и странным ошибкам.
Для таких случаев используют flock:
flock -n /tmp/backup.lock /opt/jobs/backup.sh
Файл
/tmp/backup.lock здесь не хранит данные. Он нужен как точка блокировки.Ключ
-n означает: если lock уже занят, не ждать, а сразу выйти:flock -n /tmp/backup.lock ./backup.sh
В cron это можно записать так:
* * * * * flock -n /tmp/backup.lock /opt/jobs/backup.sh
Если первый запуск ещё работает, второй просто не стартует.
Для более явного варианта можно использовать shell:
flock -n /tmp/backup.lock \
bash -c 'echo start; ./backup.sh'
А если нужно немного подождать lock, есть timeout:
flock -w 10 /tmp/backup.lock ./backup.sh
Так команда подождёт до 10 секунд, а потом завершится, если блокировка всё ещё занята.
