バックグラウンドでジョブを実行し、終了時点を確認してください。

バックグラウンドでジョブを実行し、終了時点を確認してください。

my_scriptバックグラウンドでUnixシェルスクリプト(unix)を実行し、Webインターフェイスでそれを監視する必要があります。

次のようにPHPで実際のスクリプトを起動します。

$command = 'my_script';
$pid= exec("nohup {$command} > {$logFile} & echo $!");

その後、$pid私のプロセスのpidを含む、そのプロセスがまだ実行されていることを確認できますfile_exists("/proc/{$pid}")

しかし、問題は、プロセスが終了するタイミングと終了時に実行された時間をどのように理解できるかです。

また、プロセスがいつ開始されるのかを知るための良い方法はありますか?呼び出しの前後にPHPでタイムスタンプを記録できますが、多少不正確になる可能性がありexecます。

編集する:

明確にすると、PHPスクリプトはシェルスクリプトが完了するのを待つことはできません。シェルスクリプトはバックグラウンドで実行する必要があります。おそらくmy_script3つのコマンド(ログの開始時間、実行時間、ログの完了時間)をシェルにラップしてsh -cに渡すこともできますがnohup、開始時間だけを記録することで終わらないように、シーケンス全体が原子的になりたい(すべて)エラーです。

ベストアンサー1

中間シェルを削除し、直系の子で始める必要があります。おそらくこれに似たものを使用しますproc_open(私はPHPの専門家ではありません)。その後、SIGCHLD子が終了すると表示されます。シグナルハンドラをインストールし(pcntl_signalおそらく)、その中に子供のPIDを非遮断の方法でWNOHANG待機することができます。pcntl_waitpid

file_exists("/proc/{$pid}")wait通話を制御しない場合(pid子供でない場合)、PIDはリサイクルされ、信頼できません。

おすすめ記事