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_script
3つのコマンド(ログの開始時間、実行時間、ログの完了時間)をシェルにラップして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 &