回答:
Bashがこれを行います。プロセスが終了すると、制御を戻すことで通知され、終了ステータスが特殊変数に格納されます$?
。おおよそ次のようになります。
someprocess
echo $?
詳細については、特別なパラメーターに関するbashのマニュアルを参照してください。
しかし、あなたは待っている間に他の仕事をしたいと思います。bashでは、次のように実行できます。
someprocess &
otherwork
wait %+
echo $?
someprocess &
バックグラウンドでプロセスを開始します。つまり、コントロールはすぐに戻り、他の作業を行うことができます。バックグラウンドで開始されたプロセスは、bashのジョブと呼ばれます。wait
指定されたジョブが完了するのを待ってから、そのジョブの終了ステータスを返します。ジョブはによって参照され%n
ます。%+
最後に開始されたジョブを指します。詳細については、ジョブ制御に関するbashマニュアルを参照してください。
PIDが本当に必要な場合は、次のようにすることもできます。
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
最後に開始されたバックグラウンドプロセスのPIDを含む特別な変数です。
wait
機能するのか正確にはわかりません。かなりの量のシステムリソースを必要としないことは知っています。ここでソースコードを確認できます:git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
1つ-明らかに強引な-アプローチは使用することstrace
です:
$ strace -e trace=none -e signal=none -p 12345
PID 12345でプロセスを監視し、システムコール(最初の-e
)およびシグナル(2番目-e
)をインターセプトしません。プロセスが通常の方法で終了すると、終了値が出力されます。
プロセスがシグナルによって終了した場合、straceはサイレントで終了します(上記のオプションで実行した場合)。たとえば-e signal=kill
、この動作を変更するために使用できます。ただし、シグナルがプログラムによって受信および処理された場合-e signal=all
、(または、-e signal
オプションでオプションを省略すると)大量の出力が生成される可能性があることに注意してください。
「通知」の実行の連鎖
$ process; notify $? &
プロセスが予期しない方法で終了した場合、notify
実行されないことに注意してください
トラップを設定する
プロセスは別の意味のシグナルによって通知され、適切に反応できます
#!/bin/bash
process
function finish {
notify $?
}
trap finish EXIT
どの通知を念頭に置いているのか明確ではありません。本質的には、「ベル」を鳴らすものは何でもかまいません。たとえば、1つ。図書館notify-send
からlibnotify
。
$ process; notify-send "process finished with status $?" &
プロセスがデーモンとして実行されている場合は、upstartまたはmonitの使用を検討してください。これらは一種の標準的な方法です。
http://www.alexreisner.com/code/upstart
プロセスの監視、コードの終了、プロセスの再起動、ログの書き込みなどができます。
wait
ますか?システムから通常どれくらいのCPUが必要ですか?