システム内のすべてのプロセスに関する情報を取得したいと思います。ps
プロセスを除外それ自体。
つまり、次のようになります。
ps --no-headers --pid 1111 -N
どこ1111
プロセスID今ps
コマンドを実行してください。
私は次のことを試しました
ps --no-headers --ppid $$ -N
しかし、これはいいえps
以下の「サブプロセス」で実行されている場合:
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers --ppid $$ -No pcpu,pid,comm --sort=+pcpu | tail -n 1)
最後のコマンドは、CPU使用率、プロセスID、および「最新」の最も多くのCPUを使用したプロセス名を取得しようとします。
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | tail -1)
最近までうまくいきました。しかし、Ubuntu 23.04(またはカーネル6.x)にアップデートしてps
起動時々CPUを100%使用していることを示します。。
現在、次は回避策のようです(ただし安全ではありません)。
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers -eo pcpu,pid,comm --sort=+pcpu | grep -v \ ps | tail -1)
答え1
ps
私を除く:
sh -c 'exec ps --no-headers --pid "$$" -N'
sh
独自のPIDをに変更して$$
から自分をに置き換えますps
。 PIDは変更されません。これがexec
うまくいく方法です。このメソッドはps
独自のPIDをオプションパラメータとして受け取ります--pid
。
この方法は除外されます。これ ps
ps
他のプロセス(存在する場合)は適用されません。
答え2
一般化としてps
自分のアイテムを削除する方法特に、ps
非標準-N
/--deselect
オプションをサポートしない実装では、一般的なアプローチは次のとおりです。
print_pid_and_run() {
sh -c 'echo "$$" && exec "$@"' sh
}
print_pid_and_run ps ...ps-options... |
awk 'NR == 1 {pid = $0; next}
$1 != pid'
(渡されたオプションに基づいて$1
プロセスpidに出力の実際のフィールドを変更します。)ps
ps
zsh では、sh
以下を実行して実行を回避できます。
zmodload zsh/system
print_pid_and_run() (echo $sysparams[pid] && exec "$@")
バッシュから:
print_pid_and_run() (echo "$BASHPID" && exec "$@")
(bash
上記とは対照的に、zsh
inは組み込み機能や機能を実行するために使用できないことを忘れないでください)。
答え3
あなたの質問に対する答えではなく、コメントです。
IFS=' ' read pctd proc <<<$(/bin/ps --no-headers --ppid $$ -No pcpu,pid,comm --sort=+pcpu | tail -n 1)
最後のコマンドは、CPU使用率、プロセスID、および「最新」の最も多くのCPUを使用したプロセス名を取得しようとします。
私はあなたのアプローチが間違っています。pcpu
プロセスが存在してから合計時間に対するプロセスのスレッドを実行しているCPUに費やされた時間の割合を返します。
たとえば、プロセスが開始され、まるでコマンドを実行するかのようにそれ自身を初期化するのに数ミリ秒かかります(この間、1ミリ秒間はほぼ100%CPUを使用できます)、10時間スリープモードに切り替え、次に20スレッドを作成し、20スレッドを最大限に活用します。 CPUは1分間続きます。top
たとえば、この間、CPU使用率は2000%で表示されます。今実行すると、ps -o pcpu
プロセスは合計601分の20分のCPUを使用するため、2000%の代わりに約3%が表示されます。一方、ps
コマンドの開始時にコマンドを実行すると、プロセスが1ミリ秒以上のCPU時間を使用し、100%CPU使用率を報告することがわかります。sleep 1h
ps
まだ実行中で、過去3秒間で最も多くのCPU時間を使用したプロセスを取得するには、ある時点ですべてのプロセスのCPU時間を収集し、3秒後に再収集して次の手順を実行する必要があります。ps -o pcpu
これを使用できないか、top
バッチモードで同様のアプリケーションを使用して計算を実行できます。