プロセスを監視する方法はありますか?

プロセスを監視する方法はありますか?

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

X数秒間実行され、ps -ef | grep PIDプロセスがまだ存在することを確認するスクリプトを作成したくありません。プロセスが終了した時期と終了コードが何であるかを知らせる方法があるかどうか疑問に思います。

答え1

1つの(明らかに厳しい)方法は、次のものを使用することですstrace

$ strace -e trace=none -e signal=none -p 12345

-ePID 12345を使用するプロセスは、システムコール(最初の呼び出し)と信号(2番目の呼び出し-e)をブロックすることによって監視されます。プロセスが通常の方法で終了すると、終了値が印刷されます。

プロセスがシグナルによって終了すると、straceは自動的に終了します(上記のオプションを使用して実行した場合)。たとえば、次のように-e signal=killこの動作を変更できます。ただし、プログラムが信号を受信して​​処理する場合-e signal=all(またはこのオプションを省略した場合-e signal)、大量の出力が生成される可能性があります。

答え2

  1. リンク「通知」の実行

    $ process; notify $? &
    

    プロセスが予期せず終了するとnotify実行されません。

  2. 罠を設置する

    プロセスはさまざまな意味のシグナルで表され、適切に反応できます。

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

どの通知が必要なのかわかりません。本質的に、それは「種」を鳴らすすべてになることができます。たとえば、さまざまな目的のためのものです。図書館notify-sendから。libnotify

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

答え3

Bashはこれを行います。プロセスが終了したら、制御権をユーザーに返し、終了ステータスを特殊変数に保存してそれを通知します$?。おおよそ次のようになります。

someprocess
echo $?

より特殊パラメータの bash マニュアルより多くの情報を知りたいです。

しかし、待っている間に別のことをしたいとしましょう。 Bashでは、次のことができます。

someprocess &
otherwork
wait %+
echo $?

someprocess &プロセスはバックグラウンドで開始されます。これは、コントロールがすぐに返され、他の操作を実行できることを意味します。バックグラウンドで開始されたプロセスをbashではジョブと呼びます。wait指定されたジョブが完了するまで待ってから、ジョブの終了ステータスを返します。割り当ては で参照されます%n%+最後に開始された操作を示します。よりジョブ制御の bash マニュアルより多くの情報を知りたいです。

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

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

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

答え4

ptrace()トラッカーをプロセスに接続したり、新しいプロセスを実行または設定したりできます。フックwith PTRACE_O_TRACEEXIT(linux >= 2.5.60) プロセスが終了するまで待機状態を維持し、PTRACE_GETEVENTMSG終了状態を取得します。

以下は、次のサンプル実装です。プラグ、ちょうどattachそのオプションで確認しましたが、動作するにはいくつかの変更が必要です(最終的に必要な場合はどこかにコードを投稿します)。

関連情報