Cron

如何正確使用flock(2) 和cron 腳本?

  • May 27, 2021

我正在使用 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只是不會由於業務限制。

您可以使用 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 行為(例如,它會脫離控制並且永遠不會退出),因此您可能希望在 PHP 本身中考慮這一點,或者使用timeout命令在被殺死之前給它一個最大的執行時間。

小心這也阻止fileName1.php了並發執行!

如果您想要一種允許多個並行fileName1.php但只有一個實例的安排fileName2.php,您將需要一個更複雜的同步機制來解決這個問題。

引用自:https://serverfault.com/questions/1064901