====== Предотвращение двойного запуска cron задач ====== Источник - http://www.pentarh.com/wp/2011/03/19/cron-double-task-avoid/ Администрируя высоконагруженный проект, то и дело натыкаюсь на проблему повторного запуска cron задач в то время как предыдущая задача еще не отработала. Таким образом получается, что одни и те же cron скрипты выполняют одни и те же задачи одновременно, удваивая тем самым нагрузку. При этом они начинают выполняться медленнее, и возможна лавинообразная ситуация, когда к этим двум добавится еще и третья такая же задача. Потом четвертая, а потом все упадет вообще. Как с этим бороться? ===== Вариант 1. Сложный. ===== Использовать в скрипте, который запускается по cron, проверку pid: - Проверяем наличие pid файла с идентификатором процесса - Проверяем, есть ли такой pid в памяти командой «ps -p PID» - Если pid запущен, прерываем работу - Иначе, пишем в pid файл свой pid и продолжаем Однако это требует модификации скрипта. ===== Вариант 2. Простой. ===== Есть замечательная утилитка в Linux, называется [[http://www.opennet.ru/man.shtml?topic=flock&category=1&russian=2|flock (1)]]. В качестве параметра, утилита принимает имя файла лока и команду для исполнения. flock ставит эксклюзивный лок на указанный файл и, при успехе, запускает указанную команду. Функционал flock не ограничивается только этой возможностью – на эту тему можно покурить соответствующий man. Итак, у нас есть cron задача: * * * * * user /usr/bin/php /some/heavy/script.php С помощью небольшой модификации этой строки мы сможем предотвратить повторный запуск задачи во время выполнения предыдущей задачи: * * * * * user /usr/bin/flock -xn /var/lock/script.lock -c '/usr/bin/php /some/heavy/script.php' Ну собсно все.