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

私が見つけた 1 つのことは、時にはps -aux | grep "something"常にプロセスがあるということです。プロセスは基本的にコマンドそのものです。そのため、php でコマンドを使用する前に、実際にシェルでコマンドを試してください。

于 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 に答える