Linux bash 呼び出しをトレースする

Linux bash 呼び出しをトレースする

Linux でコマンドがどこから実行されたかを追跡する方法があるかどうか知りたいです。

たとえば、スクリプトを呼び出す場合、プログラムまたは別の bash スクリプトから開始されたなど、スクリプトがどこから呼び出されたかを追跡する方法はありますか。

答え1

スクリプトが bash で記述されている場合、$PPID (親プロセス ID の略だと思います) という組み込み変数があり、これを使用してスクリプトを呼び出したユーザーを確認できます。次に例を示します。

CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER

説明:

  1. $PPIDは親プロセス(呼び出し元)のプロセスIDを示します。
  2. 追伸コマンドはすべてのプロセスをリストします
  3. グレップコマンドは行の先頭にPPIDを含む行を探します。
  4. awkコマンドは最後の列、つまり呼び出し元の名前のみを出力します。

答え2

だった実行された実行可能ファイルに何らかのログが記録されていない限り、「実行元」を特定するのはかなり難しいと思います。実行が終了したら、調べるべきことはほとんど残っていないでしょう。

それであれば実行中の場合、 を使用するだけで、親プロセス ID (PPID) から呼び出し元に関する十分な情報を取得できる可能性がありますps

答え3

プロセスがまだ実行中の場合は、コマンドによって提供される階層的な視覚化 (フォレストまたはプロセス ツリーとも呼ばれます) を使用できますps

たとえば次のように試してください:

ps xf

出力は次のようになります。

 3627 ?        Ss     0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
 3655 ?        S      0:38  \_ bwm --interface eth0 --download
 3656 ?        S      0:38  \_ bwm --interface eth0 --upload
 3687 ?        S      0:20  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
  574 ?        S      0:00  |   \_ sleep 1
 3713 ?        S      0:00  \_ wmiir read /event
 3714 ?        S      0:00  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ?        S      0:00      \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ?        Ss     0:03          \_ xterm
22673 pts/0    Ss+    0:00              \_ bash

答え4

Hai Vu の回答のアップグレードの可能性:

ps -p $PPID -o args=

は、出力を親のプロセス ID に制限します。 では、-p独自の出力を指定できます。この場合、which を使用します (私の場合は、これで必要な情報が得られます)。 考えられるアップグレードは、大量の情報を取得して解析するのではなく、必要な情報のみを要求することです。ps-oargs=ps

を入手したら、 「dirs」$PPIDを調べ/proc/$PPID/てより詳細な情報を入手することもできます。

関連情報