如果已经运行,如何阻止cron作业执行

San*_*jay 25 php cron centos

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

问题是如果cron作业需要10分钟以上,那么同一个cron作业的另一个实例将启动.

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

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

但是,当由于任何原因未通过脚本删除或删除锁定文件时,可能存在一个问题.cron永远不会重新开始.

有没有办法我可以再次执行cron作业,如果它已经在运行,使用Linux命令或类似的?

Ja͢*_*͢ck 45

咨询锁定就是为了这个目的.

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

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

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

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

  • 不可能.无论什么时候进程停止,操作系统都会释放锁定,因为h00ligan的链接文章需要一些丑陋的本地化黑客. (8认同)

Leo*_*nov 15

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

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


小智 12

flock()对我来说很棒 - 我有一个cron作业,每5分钟安排一次数据库请求,所以不能同时运行几个是至关重要的.这就是我做的:

$filehandle = fopen("lock.txt", "c+");

if (flock($filehandle, LOCK_EX | LOCK_NB)) {
    // code here to start the cron job
   flock($filehandle, LOCK_UN);  // don't forget to release the lock
} else {
    // throw an exception here to stop the next cron job
}

fclose($filehandle);
Run Code Online (Sandbox Code Playgroud)

如果你不想杀死下一个预定的cron作业,只是暂停它直到正在运行的作业完成,那么只需省略LOCK_NB:

if (flock($filehandle, LOCK_EX)) 
Run Code Online (Sandbox Code Playgroud)