我有一个 php 脚本,我在 CentOS 上每 10 分钟通过 cron 执行这个脚本。
问题是,如果 cron 作业需要超过 10 分钟,那么同一 cron 作业的另一个实例将启动。
我尝试了一个技巧,那就是:
- 使用 php 代码创建一个锁文件(与 pid 文件相同) cron 作业开始了。
- 在作业完成时使用 php 代码删除了锁定文件。
- 当任何新的 cron 作业开始执行脚本时,我检查了是否锁定 文件存在,如果存在,则中止脚本。
但是可能存在一个问题,即当锁定文件由于某种原因没有被脚本删除或删除时。 cron 将永远不会重新启动。
如果 cron 作业已经在运行,我有什么办法可以通过 Linux 命令或类似命令再次停止它的执行?
最佳答案
Advisory locking正是出于这个目的。
您可以使用 flock()
完成建议锁定.只需将该函数应用于先前打开的锁定文件,以确定另一个脚本是否锁定了它。
$f = fopen('lock', 'w') or die ('Cannot create lock file');
if (flock($f, LOCK_EX | LOCK_NB)) {
// yay
}
在这种情况下,我添加了 LOCK_NB
以防止下一个脚本等待第一个脚本完成。由于您使用的是 cron,因此总会有下一个脚本。
如果当前脚本提前终止,任何文件锁都会被操作系统释放。
关于php - 如何防止 cron 作业执行,如果它已经在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10552016/