Назад | Перейти на главную страницу

Написание системы запирания

У меня есть 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 ?