Как правильно использовать flock (2) со сценарием cron?

Я использую crontab для выполнения сценария php, который извлекает данные и записывает их в базу данных. Моя запись в crontab выглядит так:

* * * * * php /path/to/file/fileName1.php
* * * * * php /path/to/file/fileName2.php 
... you get the point

Я бы хотел использовать flock, чтобы предотвратить запуск сценария в случае, если предыдущий вызов не завершился. Каждый сценарий записывает в разные таблицы в базе данных и Я не могу начать запись в таблицу, пока не завершится выполнение предыдущего вызова. Увеличение продолжительности между вызовами, например: * / 2 * * * * php /path/to/file/fileName1.php, просто не будет связано с ограничениями бизнеса.

2
задан 27 May 2021 в 20:27
1 ответ

Вы можете заблокировать сам файл с помощью cron, и это должно работать нормально (при условии, что ничто другое не пытается заблокировать файл). Затем проверьте, есть ли такая же блокировка во втором скрипте.

Обратите внимание, что в этой конфигурации параллельное выполнение обычно завершается ошибкой с аномальным кодом выхода. Вы можете использовать аргумент -E0 , чтобы он всегда возвращал успешный код выхода.

* * * * * flock -nx /path/to/file/fileName1.php -c "php /path/to/file/fileName1.php"
* * * * * flock -nx /path/to/file/fileName1.php -c "php /path/to/file/fileName2.php"

Также обратите внимание, что это не защищает от ненормального поведения PHP (скажем, он разворачивает управление ouf и никогда не завершает работу), поэтому вы можете учесть это в самом PHP или использовать команду timeout , чтобы дать ему максимальный период времени выполнения до уничтожения.

Будьте осторожны, это также предотвращает одновременный запуск fileName1.php !

Если вам нужна схема, в которой вы разрешаете несколько параллельных fileName1.php , но только один экземпляр fileName2.php , вам потребуется более сложный механизм синхронизации, чтобы учесть это.

2
ответ дан 28 July 2021 в 12:19

Теги

Похожие вопросы