我有一个玉米作业,每分钟执行一个PHP脚本,并执行processchecker.php。脚本processchecker.php将检查用户进程,其中包含文件名backgroundprocess.php。
如果我通过访问它们各自的url来手动触发这些文件,这将完美地工作。
问题来了,当我自动化的过程作为一个cron作业,由于某种原因没有返回我正在寻找的过程。Cron作业似乎在没有用户帐户的情况下运行,我怀疑我需要一种列出所有进程的方法,特别是那些由Cron作业本身启动的进程。
processcheck.php
<?php
exec("ps aux", $output, $result);
$found=0;
foreach ($output AS $line) if(strpos($line, "backgroundprocess.php")){ $found=$found+1;};
if($found==0){
//service not running start it all over again
if (!$pid = shell_exec("nohup php backgroundprocess.php > /dev/null 2>&1 & echo $!")) return false;
}else{
//service is Already running
}
?>
从我看到的exec("ps aux", $output, $result);
不是抓取由cron作业本身启动的进程......因此,我的后台进程总是会一遍又一遍地启动。
请注意,所有这些都是在远程vps服务器上,我使用cpanel。
编辑结果为0输出是
Array
(
[0] => USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[1] => rycjptbb 1 0.0 0.0 6324 600 ? SN 14:51 0:00 jailshell (rycjptbb) [init] ell -c nohup php public_html/processchecker.php > /dev/null & echo $!
[2] => rycjptbb 3 1.0 0.0 248940 12308 ? SN 14:51 0:00 php public_html/processchecker.php
[3] => rycjptbb 4 0.0 0.0 110236 1112 ? RN 14:51 0:00 ps aux
)
据我所知,您只是想检查当前是否有其他相同的进程正在运行。例如,如果process1.php每1分钟运行一次,并且运行时间可能需要3分钟,那么您不希望在第二分钟运行另一个进程。如果是这种情况,那么您可以检查是否存在另一个具有相同名称的进程:
function is_other_process_exists()
{
$my_name = 'xxx'; //your process name, e.g. process1.php
$ps = `ps gax`;
$psLines = explode("'n", $ps);
array_pop($psLines);
$myLines = array();
foreach ( $psLines as $psLine )
{
if (strstr($psLine, $my_name))
{
$myLines[] = $psLine;
}
}
if ( count($myLines) > 1 ) {
$myPid = posix_getpid();
echo "process is already running with process id {$myPid}";
exit;
}
}