問題の観点からここpidof
、OPはシェルスクリプトでプロセスのpidを繰り返しポーリングしようとします。もちろん、これはpidof
プログラムの新しいプロセスが毎秒数回開始される必要があるため、非効率的です(これが質問のCPUスパイクの原因であるかどうかはわかりませんが、可能になります)。
通常、シェルスクリプトでこの種の問題を解決する方法は、単一のプログラムを使用して必要なデータを出力し、stdout
必要に応じていくつかのテキスト処理を実行することです。これには、より多くのプログラムを同時に実行することが含まれますが、ポーリング目的で新しいプロセスが継続的に生成されないため、CPU使用率が少なくなる可能性があります。
したがって、上記の問題に対する解決策の1つは、プロセスの作成時にプロセスの名前とPIDを出力するいくつかのプログラムを使用することです。これにより、次のことができます。
pids-names |
grep some_program |
cut -f 2 |
while read pid; do
process-pid "$pid"
done
これに関する問題は、より基本的な質問が提起されることです。 PIDとプロセス名が生成されたときにどのように印刷しますか?
というプログラムが見つかりましたps-watcher
。別のオプションは、ログが直接渡される場合を使用することです。理想的な解決策はこれよりもシンプルで移植性が高いですが、これが最良のオプションであれば受け入れます。perl
ps
auditd
tail -f
auditd
答え1
Linux関連の回答:
perf-toolsにモニタリングの実行それがまさにそれがすることです。 ftraceなど、さまざまなLinux関連機能を使用します。 Debian では次の場所にあります。パフォーマンスツールが不安定です。パック。
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
これを行うポータブルな方法があるかどうか疑われます。