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

Check if a php file command is already running on cron

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

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

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

更新 经过一些研究发现使用 system "flock" 命令做同样事情的好变体。可能有用:

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

如果你想要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
    }

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

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

所以,我侦察运行宁系统"ps aux"是最好的解决办法。当然,这仅适用于 Linux-based 系统(和 MacOS)。

这个片段可能是解决问题的好方法。请注意 "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 作业 运行 定义此特定文件时,此代码很方便