プロセスの作成時にPIDとプロセス名を出力する


10

ここでの質問から、OP pidofはシェルスクリプトで使用しているプロセスのPIDを繰り返しポーリングする必要があります。もちろん、これは非効率的です。pidof毎秒数回プログラムの新しいプロセスを開始する必要があるためです(これが問題のCPUスパイクの原因であることはわかりませんが、可能性が高いようです)。

通常、シェルスクリプトでこの種のことを回避する方法は、必要なデータを出力する単一のプログラムを操作しstdout、必要に応じてテキスト処理を行うことです。これには、より多くのプログラムを同時に実行する必要がありますが、ポーリングの目的で新しいプロセスが継続的に作成されないため、CPUの負荷が低くなる可能性があります。

したがって、上記の質問の1つの解決策は、プロセスの作成時にプロセスの名前とPIDを出力するプログラムを用意することです。それからあなたは次のようなことをすることができます:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

これの問題は、それがより根本的な問題を提起することです、pidsとプロセス名はそれらが作成されたときにどのように印刷されますか?

というプログラムを見つけましたps-watcherが、問題はperlスクリプトが繰り返し実行さpsれるため、実際には問題が解決しないことです。別のオプションを使用auditdすることもできます。これは、ログがを介して直接処理された場合に機能する可能性がありますtail -f。理想的な解決策は、これよりも単純で移植性が高いでしょうauditdが、最善の選択肢であれば解決策を受け入れます。


1
興味深い補足として、pidは最初に作成プロセス(またはバリアント)のコピーとして作成されfork、次にexecファミリーのメンバーを使用して新しいプログラムが開始されます。したがって、おそらくexec*でなく、をログに記録する必要がありますfork
derobert 2014年

2
私が知っている唯一の移植可能な効率的な方法は、プロセスが終了した後にレコードを書き込む通常のUnixプロセスアカウンティングを使用することです。プロセスが作成または実行されたときにプロセスをキャッチする場合は、おそらくLinuxのauditd、systemtap、dtraceなどのシステム固有のものが必要です。
Mark Plotnick 2014年

したがって、上記の質問の1つの解決策は、プロセスの作成時にプロセスの名前とPIDを出力するプログラムを用意することです。–それらが作成されたとき?あなたが考えているのはオブザーバーです(これはWebブラウザーの世界ではこれを呼んでいます)。Pythonが「ドアガード」として機能するのに適しているのでしょうか。事実は、Pythonがシステムの内部の仕組み(などdbus)を深く掘り下げることができるということです。
syntaxerror

1
@syntaxerror DBusは、この場合のシステムの内部動作とはかけ離れています。実際、ここで説明している内容よりも2レベル程度上です。
peterph 2014年

OK、OSIの専門用語では、ここで説明するはdbusよりも低いかもしれません。私は、両方が同じ階層にあるかどうかについて深く考えていなかったことを認めます。
syntaxerror

回答:


6

Linux固有の答え:

perf-toolsには、まさにこれを実行するexecsnoopが含まれています。ftraceなど、Linux固有のさまざまな機能を使用します。Debianでは、そのperf-tools-unstableパッケージに含まれています。

man catが別の端末で実行している例:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

これを行うポータブルな方法があるとは思えません。


2

そこで、これを行う正しい方法TMは、実際に実行しているシステムとカーネルに大きく依存します。DTraceはSolaris、Free / NetBSD、Linuxで動作するはずです。

特にLinuxの場合、ftrace(コンパイル時に有効にする必要があります-通常は有効)またはnetlinkを介したprocイベントを使用できます-詳細については、問題へのSOの回答を参照してください(そして投票してください、スコア〜受け入れられた回答の30対0はおかしく見えます)。貧乏人のトレーサーはおそらくstrace -eexec,fork(無理なオーバーヘッドがありますが)を使用して実装できます。

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