![如何正确使用 flock(2) 和 cron 脚本?](https://linux22.com/image/766981/%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8%20flock(2)%20%E5%92%8C%20cron%20%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我正在使用 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
由于业务限制,增加调用之间的持续时间(例如:)是行不通的。
答案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 行为(比如说它失去控制并且永不退出),所以您可能需要在 PHP 本身中解决这个问题,或者使用命令timeout
给它一个在被杀死之前的最大执行时间。
请注意这也会阻止fileName1.php
同时运行!
如果您想要一种允许多个并行fileName1.php
但只有一个实例的安排fileName2.php
,那么您将需要一个更复杂的同步机制来解决这个问题。