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

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

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はリサイクルされ、信頼できません。

答え2

Webフロントエンドを使用しているので、at/batchが必要なようです。結果はユーザーに電子メールで送信するか、ユーザーが照会することができます(クライアント側のJavaScriptまたは単純なユーザーベースのチェックを使用)。

答え3

スクリプトで終了条件を記録する最も簡単な方法は、記録することです。

#!/bin/sh
trap 'date +"
    My name is $0. My PID is $$.
    My start time was '"$(date)."'
    The time is now %X on %x.
    My exit code is $?. Goodbye.
"   >/tell/somebody' EXIT
: now do some stuff

EXITトラップはすべてのシャットダウンシナリオで機能するはずですが、信号を殺す

問題のスクリプトを編集できない場合は、指示を制御できるシェルにスクリプトをラップします。たとえば、次のようになりsh -cます。

trap=': the trap' sh -c '
trap "$trap" 0;. "$0"'   \
    ./script/i/cant/edit \
    positional params    &

w/を使用して同様の操作を実行できますが、w /sh -sの値は$0コントロールほど単純ではないかもしれません。一部のシェルでは、execこれを変更するには新しいファイル/代替シェルが必要です。(時にはプロセス名のすべてのパスコンポーネントを変更/削除するためにPATH=.シンボリックリンクを使用します)exec

echo 'trap "$trap" EXIT'   |
cat - ./script/i/cant/edit | 
trap=': the trap' sh -s -- \
    positional params go here &

関連情報