如何正确使用 flock(2) 和 cron 脚本?

如何正确使用 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由于业务限制,增加调用之间的持续时间(例如:)是行不通的。

答案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,那么您将需要一个更复杂的同步机制来解决这个问题。

相关内容