0

编码:

exec('ps aux |grep tweet',$output,$return_var);
if(count($output)>0){
    exec('php ' . DOCROOT . 'gremlins/tweet_gremlin.php &');
    file_put_contents(DOCROOT . 'gremlins/tweet_gremlin.log', date('r') . ' Tweet Gremlin was not running. Starting now...');
}

在我看来,这段代码是有道理的,但它只会导致浏览器无限循环。我要做的是检查 tweet_gremlin.php 是否正在运行,如果没有运行,请启动它。DOCROOT 是前面代码中定义的常量。

4

4 回答 4

2

我发现的一件事是,有时当你这样做时ps -aux | grep "something",总会有一个过程。该过程基本上是您的命令本身!因此,在 php 中使用它们之前,请在 shell 中实际尝试这些命令。

于 2012-08-02T17:30:15.787 回答
1

你可以使用:

if (!exec("ps aux | grep tweet | grep -v grep")) {
    // do something
}

grep -v部件从列表中删除grep进程。

此外,要使用等执行后台进程exec,您将需要重定向输出,否则您的脚本将挂起,直到进程完成。每个例子:

exec('php script.php >/dev/null &');
于 2012-08-02T17:34:33.737 回答
1

我想你可能需要尝试

if( count($output)==0 )

因为您想测试该过程是否不存在?

于 2012-08-02T18:11:00.507 回答
0

您或某人可能会发现这很有用,这是我很久以前写的脚本

<?php
// shut system if wget is not running

function rempty($tbl)
{
    foreach ($tbl as $key => $val)
    {
        if (trim($val) == '')
            unset ($tbl[$key]);
    }

    return $tbl;
}

while (count(rempty(explode("\n",trim(shell_exec('pgrep wget'))))) > 0)
    sleep(1);

echo 'done. shutting down in 30 mins...';
sleep (30*60);
shell_exec('sudo halt');

?>
于 2012-08-02T17:32:31.167 回答