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


9

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

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

回答:


3

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

someprocess
echo $?

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

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

someprocess &
otherwork
wait %+
echo $?

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

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

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

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


そして、どのように機能しwaitますか?システムから通常どれくらいのCP​​Uが必要ですか?
2013

1
私はbashがどのようにwait機能するのか正確にはわかりません。かなりの量のシステムリソースを必要としないことは知っています。ここでソースコードを確認できます:git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
lesmana

6

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


4
  1. 「通知」の実行の連鎖

    $ process; notify $? &

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

  2. トラップを設定する

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

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

どの通知を念頭に置いているのか明確ではありません。本質的には、「ベル」を鳴らすものは何でもかまいません。たとえば、1つ。図書館notify-sendからlibnotify

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


1

ではptrace()、あなたがプロセスにトレーサーを取り付け(または新しいものを実行する)ことができ、設定されたフックPTRACE_O_TRACEEXIT、その後で、プロセスの終了まで(のlinux> = 2.5.60)と睡眠をPTRACE_GETEVENTMSG得る終了ステータス。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.