Знали, как не дать cron-задаче запуститься второй раз поверх первой?
Иногда скрипт запускается по расписанию, но предыдущий запуск ещё не закончился. Например, 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 секунд, а потом завершится, если блокировка всё ещё занята.
➡️ DevOps Ready | #совет
Иногда скрипт запускается по расписанию, но предыдущий запуск ещё не закончился. Например, 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 секунд, а потом завершится, если блокировка всё ещё занята.
➡️ DevOps Ready | #совет