バックグラウンド コマンドを追跡する 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_*
呼び出しが正しいかどうかもわかりません。