ここでの質問から、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
が、最善の選択肢であれば解決策を受け入れます。
dbus
)を深く掘り下げることができるということです。
fork
、次にexec
ファミリーのメンバーを使用して新しいプログラムが開始されます。したがって、おそらくexec*
でなく、をログに記録する必要がありますfork
。