1

私はphpとそのコマンドラインインターフェースを使ってスクリプトを実行しています。スクリプトの実行中に、 php.netの次のコードを使用して、バックグラウンドでいくつかのコマンドを呼び出します (かなり時間がかかるものもあります) 。

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
} 

すべてのコマンドが完全に実行される前に、メイン スクリプトが数回呼び出される場合があります。

コマンドを実行する前に、スクリプトの前回の実行からバックグラウンドで実行されているかどうかを確認する方法はありますか?

4

1 に答える 1

1

バックグラウンド コマンドを追跡する 1 つの方法は、情報をファイルに保存することです。コマンドの名前はシステム全体で一意ではない可能性があるため、それを確認することはできません。プロセス ID を構成ファイルに保存し、コマンドを文字列で確認できます。

function execInBackground($cmd)
{
    $running = false;

    // get the state of our commands
    $state = json_decode(file_get_contents("state.json"));

    // check if the command we want to run is already running and remove commands that have ended
    for ($i = 0; $i < count($state->processes); $i++)
    {
        // check if the process is running by the PID
        if (!file_exists("/proc/" . $state->processes[$i]->pid))
        {
            // this command is running already, so remove it from the list
            unset($state->processes[$i]);
        }

        else if ($cmd === $state->processes[$i]->command)
        {
            $running = true;
        }
    }

    // reorder our array since it's probably out of order
    $state->processes = array_values($state->processes);

    // run the command silently if not already running
    if (!$running)
    {
        $process = proc_open($cmd . " > /dev/null &", array(), $pipes);
        $procStatus = proc_get_status($process);

        $state->processes[] = array("command" => $cmd, "pid" => $procStatus["pid"]);
    }

    // save the new state of our commands
    file_put_contents("state.json", json_encode($state));
}

構成ファイルは次のようになります。

{
    "processes": [
        {
            "command": "missilecomm launch -v",
            "pid": 42792
        }
    ]
}

(私はJSONの「説得」派ですが、好きな形式を使用できます;))

これは、同じコマンド文字列を複数回実行したい場合には機能しません。

execInBackground()完成したコマンドをクリアする方法のため、 Linux でのみ機能します。プロセス ID が Windows に存在するかどうかを確認するには、別の方法を見つける必要があります。このコードはテストされておらず、proc_*呼び出しが正しいかどうかもわかりません。

于 2013-05-23T02:49:08.960 に答える