一尘不染

如果cron作业已在运行,则如何防止其执行

php

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

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

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

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

但是可能存在一个问题,就是由于某种原因,脚本未删除或删除锁定文件时。Cron将永远不会再次启动。

有什么方法可以停止cron作业(如果已经在运行),Linux命令或类似命令吗?


阅读 315

收藏
2020-05-29

共1个答案

一尘不染

咨询锁定正是为此目的而进行的。

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

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

在这种情况下,我要添加LOCK_NB以防止下一个脚本等待第一个脚本完成。由于您使用的是cron,因此始终会有下一个脚本。

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

2020-05-29