检查 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 作业 运行 定义此特定文件时,此代码很方便
我有一个每分钟执行一次的 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 作业 运行 定义此特定文件时,此代码很方便