У меня есть cronjob для rsync, который запускается каждые 2 минуты, но иногда занимает больше 2 минут. Для этого я написал простую систему блокировки, которая проверяет, если файл не найден, записывает файл блокировки, предпринимает действия и удаляет этот файл блокировки.
Теперь, если скрипт выйдет из строя или по какой-то причине будет убит, этот файл блокировки будет задерживаться и вызывать проблемы.
Что было бы хорошим способом убедиться, что задача cron будет запущена снова в какой-то момент? Я подумал о том, чтобы проверить возраст файла блокировки и удалить его, если он старше определенного периода, но для этого должны быть более элегантные решения, я думаю ...
отредактировал:
Я сейчас реализовал flock. Я был немного смущен тем, почему файл всегда существует, но я нашел эту страницу, которая объясняет, как это работает, путем сохранения pid в информации о файле:
http://mattiasgeniar.be/2012/07/24/prevent-cronjobs-from-overlapping-in-linux/
Сохраните PID критического процесса как часть блокировки, и при повторном запуске сценария проверьте, активен ли процесс.
Лучше использовать каталог блокировки, а не файл блокировки, поскольку mkdir - это атомарная операция. Вам не нужно проверять, существует ли блокировка, и затем создавать ее, если нет, что оставляет окно возможностей для чего-то другого, чтобы получить блокировку. Поместите PID критического процесса в каталог блокировки в виде файла и т. Д.
В Linux вы можете использовать стадо утилита, которая сделает все это за вас.
Проверьте, если процесс и файл блокировки существует. Если существует только один из них, что-то не так, и с ним нужно работать правильно. Например. Если файл блокировки существует, а процесс не запущен, удалите файл блокировки и продолжайте.
Я знаю, что у вас есть собственная система запирания, но я сделаю это с fcron и exesev (ложь)
exesev
boolean(false)
Can a job be executed several times simultaneously ?