我有一个每分钟执行一次的cron作业。但我发现它已经多次运行了。我正在寻找一种方法来检查流程是否仍在运行,然后不启动新流程,或者在开始新流程之前终止已经运行的流程。
答案 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作业将永远不会自动运行:
所以,我重新运行系统&#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
运行时,此代码非常方便