通过cron job运行的脚本获取所有用户进程

时间:2015-06-01 11:40:32

标签: php cron

我有一个每分钟执行一次PHP脚本的玉米作业并执行 processchecker.php 。然后,脚本 processchecker.php 将检查用户进程,其中包含文件名 backgroundprocess.php

如果iam通过访问各自的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
)

1 个答案:

答案 0 :(得分:-1)

根据我的理解,您只想检查当前是否有其他相同的进程正在运行。 例如,如果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;
    }
}