如何防止 cron 作业执行(如果它已经在运行)

2022-08-30 13:51:56

我有一个php脚本,我在CentOS上每10分钟通过cron执行这个脚本。

问题是,如果 cron 作业花费的时间超过 10 分钟,则将启动同一 cron 作业的另一个实例。

我尝试了一个技巧,那就是:

  1. 在 cron 作业启动时,使用 php 代码创建了一个锁定文件(与 pid 文件相同)。
  2. 作业完成后删除了带有 php 代码的锁定文件。
  3. 当任何新的cron作业开始执行脚本时,我检查了锁定文件是否存在,如果是,则中止脚本。

但是可能存在一个问题,即当由于任何原因未被脚本删除或删除锁定文件时。cron将永远不会再开始。

如果 cron 作业已经在运行,有没有办法使用 Linux 命令或类似命令再次停止执行 cron 作业?


答案 1

建议锁定正是为此目的而进行的。

您可以使用 flock() 完成建议锁定。只需将该函数应用于以前打开的锁定文件,即可确定另一个脚本是否具有锁定。

$f = fopen('lock', 'w') or die ('Cannot create lock file');
if (flock($f, LOCK_EX | LOCK_NB)) {
    // yay
}

在本例中,我添加是为了防止下一个脚本等到第一个脚本完成。由于您使用的是 cron,因此总会有下一个脚本。LOCK_NB

如果当前脚本过早终止,操作系统将释放任何文件锁。


答案 2

如果可以配置代码,也许最好不要编写代码:

https://serverfault.com/questions/82857/prevent-duplicate-cron-jobs-running


推荐