web-dev-qa-db-ja.com

プロセスを聞く方法はありますか?

LinuxとUNIXでプロセスをリッスンする方法があるかどうかを知りたいのですが、プロセスがいつ終了し、プロセス(スクリプト)の終了コードは何ですか。

X秒を実行し、プロセスがまだ生きているかどうかをps -ef | grep PIDで確認するスクリプトを作成したくありません。プロセスが終了したときにプロセスが通知する方法があるかどうか、およびその終了コードは何かを知りたいです。

8
Nir

Bashがこれを行います。プロセスが終了すると、制御を戻すことで通知し、終了ステータスを特別な変数$?に格納します。おおまかに次のようになります。

someprocess
echo $?

詳細については、 特別なパラメータに関するbashマニュアル を参照してください。

しかし、私はあなたが待っている間に他の仕事をしたいと思っていると思います。 bashでは、次のように実行できます。

someprocess &
otherwork
wait %+
echo $?

someprocess &はバックグラウンドでプロセスを開始します。つまり、制御はすぐに戻り、他の作業を行うことができます。バックグラウンドで開始されたプロセスは、bashのジョブと呼ばれます。 waitは、指定されたジョブが終了するのを待ってから、そのジョブの終了ステータスを返します。ジョブは%nによって参照されます。 %+は、最後に開始されたジョブを示します。詳細については、 ジョブ制御に関するbashマニュアル を参照してください。

本当にPIDが必要な場合は、次のようにすることもできます。

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$!は、最後に開始されたバックグラウンドプロセスのPIDを含む特別な変数です。

3
lesmana

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オプションを省略する)は大量の出力を生成する可能性があることに注意してください。

6
  1. 「通知」の実行を連鎖させる

    $ process; notify $? &
    

    プロセスが予期しない方法で終了する場合、notifyは実行されないことに注意してください

  2. トラップの設定

    プロセスは異なる意味のシグナルによって通知され、適切に反応することができます

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

念頭に置いている通知が明確ではありません。本質的には、もちろん「ベル」を鳴らすものなら何でもかまいません。多くの人に1つ。 notify-sendlibnotifyライブラリから。

$ process; notify-send "process finished with status $?" &
4

プロセスがデーモンとして実行される場合は、upstartまたはmonitの使用を検討してください。これらは、一種の標準的な方法です。

http://www.alexreisner.com/code/upstart

http://mmonit.com/monit/

プロセスの監視、コードの終了、プロセスの再起動、ログの書き込みなどを行うことができます。

2
damphat

ptrace()を使用すると、トレーサーをプロセスにアタッチ(または新しいプロセスを実行)し、hookPTRACE_O_TRACEEXIT(linux> = 2.5.60)プロセスが終了するまでスリープし、PTRACE_GETEVENTMSGを使用して終了ステータスを取得します。

ここに stopper というサンプル実装があります。attachオプションのみでチェックしましたが、動作させるにはいくつかの変更が必要でした(最終的には必要に応じてコードをどこかに投稿します)。

0
Alex