LinuxとUNIXでプロセスをリッスンする方法があるかどうかを知りたいのですが、プロセスがいつ終了し、プロセス(スクリプト)の終了コードは何ですか。
X
秒を実行し、プロセスがまだ生きているかどうかをps -ef | grep PID
で確認するスクリプトを作成したくありません。プロセスが終了したときにプロセスが通知する方法があるかどうか、およびその終了コードは何かを知りたいです。
Bashがこれを行います。プロセスが終了すると、制御を戻すことで通知し、終了ステータスを特別な変数$?
に格納します。おおまかに次のようになります。
someprocess
echo $?
詳細については、 特別なパラメータに関するbashマニュアル を参照してください。
しかし、私はあなたが待っている間に他の仕事をしたいと思っていると思います。 bashでは、次のように実行できます。
someprocess &
otherwork
wait %+
echo $?
someprocess &
はバックグラウンドでプロセスを開始します。つまり、制御はすぐに戻り、他の作業を行うことができます。バックグラウンドで開始されたプロセスは、bashのジョブと呼ばれます。 wait
は、指定されたジョブが終了するのを待ってから、そのジョブの終了ステータスを返します。ジョブは%n
によって参照されます。 %+
は、最後に開始されたジョブを示します。詳細については、 ジョブ制御に関するbashマニュアル を参照してください。
本当にPIDが必要な場合は、次のようにすることもできます。
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
は、最後に開始されたバックグラウンドプロセスのPIDを含む特別な変数です。
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
プロセスの監視、コードの終了、プロセスの再起動、ログの書き込みなどを行うことができます。
ptrace()
を使用すると、トレーサーをプロセスにアタッチ(または新しいプロセスを実行)し、hookをPTRACE_O_TRACEEXIT
(linux> = 2.5.60)プロセスが終了するまでスリープし、PTRACE_GETEVENTMSG
を使用して終了ステータスを取得します。
ここに stopper というサンプル実装があります。attach
オプションのみでチェックしましたが、動作させるにはいくつかの変更が必要でした(最終的には必要に応じてコードをどこかに投稿します)。