检查是否已在cron上运行php文件命令

时间:2015-09-08 11:45:47

标签: php process cron

我有一个每分钟执行一次的cron作业。但我发现它已经多次运行了。我正在寻找一种方法来检查流程是否仍在运行,然后不启动新流程,或者在开始新流程之前终止已经运行的流程。

4 个答案:

答案 0 :(得分:4)

这里可以有很多变种来测试它。例如,您可以在任务正在进行时更新数据库,并且每次运行都会测试此标志。或者您可以打开文件并lock。当你的脚本执行时 - 测试你是否可以锁定这个文件。或者您可以阅读进程列表,如果没有您的脚本 - 继续执行

因此,主要目标是 - 创建somewhere标志,这将告诉您的脚本它已在进行中。但对于您的具体情况更好 - 这是您的选择。

<强>更新 经过一些研究发现好的变种使用系统“flock”命令来做同样的事情。可能有用:

* * * * * flock -n /some/lockfile command_to_run_every_minute

答案 1 :(得分:4)

如果你想要php解决方案,简单的方法是创建一个锁文件,每次执行脚本时,检查文件是否存在然后退出脚本,如果不是让脚本结束。但我觉得在cron指令中使用flock更好;)

<?php
    $filename = "myscript.lock";
    $lifelimit = 120; // in Second lifetime to prevent errors
    /* check lifetime of file if exist */
    if(file_exists($filename)){
       $lifetime = time() - filemtime($filename);
    }else{
       $lifetime = 0;
    }
    /* check if file exist or if file is too old */
    if(!file_exists($filename) ||  $lifetime > $lifelimit){
        if($lifetime > $lifelimit){
            unlink($filename); //Suppress if exist and too old
        }
        $file=fopen($filename, "w+"); // Create lockfile
        if($file == false){
            die("file didn't create, check permissions");
        }
        /* Your process */
        unlink($filename); //Suppress lock file after your process 
    }else{
        exit(); // Process already in progress
    }

答案 2 :(得分:1)

从所有锁定机制(包括flock和lock文件)开始 - 请注意,如果出现问题,您的cron作业将永远不会自动运行:

  • flock:如果服务器崩溃(有时会发生这种情况),您将在命令上进行永久锁定(直到手动删除)。
  • 锁定文件:如果命令因致命错误而失败,则您的文件将被删除,因此cron作业无法启动(当然,您可以使用错误处理程序,这无论如何都会赢得&#39 ; t可以避免由于内存限制或服务器重置而导致的故障。

所以,我重新运行系统&#34; ps aux&#34;是最好的解决方案。当然,这仅适用于基于Linux的系统(和MacOS)。

答案 3 :(得分:1)

这个剪切可能是解决问题的好方法。请注意,必须使用“grep -v grep”来过滤掉shell_exec中的特定查询。

#!/usr/bin/php -f
<?php

$result = shell_exec("ps aux | grep -v grep |  grep ". basename(__FILE__) );
echo strlen($result) ? "running" : "not running";

当您需要定义此特定文件是否由cron job

运行时,此代码非常方便