ps出力からps自体を除外します。

ps出力からps自体を除外します。

システム内のすべてのプロセスに関する情報を取得したいと思います。psプロセスを除外それ自体。

つまり、次のようになります。

ps --no-headers --pid 1111 -N

どこ1111プロセスIDpsコマンドを実行してください。

私は次のことを試しました

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

この方法は除外されます。これ psps他のプロセス(存在する場合)は適用されません。

答え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に出力の実際のフィールドを変更します。)psps

zsh では、sh以下を実行して実行を回避できます。

zmodload zsh/system
print_pid_and_run() (echo $sysparams[pid] && exec "$@")

バッシュから:

print_pid_and_run() (echo "$BASHPID" && exec "$@")

bash上記とは対照的に、zshinは組み込み機能や機能を実行するために使用できないことを忘れないでください)。

答え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 1hps

まだ実行中で、過去3秒間で最も多くのCPU時間を使用したプロセスを取得するには、ある時点ですべてのプロセスのCPU時間を収集し、3秒後に再収集して次の手順を実行する必要があります。ps -o pcpuこれを使用できないか、topバッチモードで同様のアプリケーションを使用して計算を実行できます。

答え4

このようにしてくださいフィルタの廃棄ps

$ read pctd pid proc < <(
    ps --no-headers -eo pcpu,pid,comm |
        awk '$1>=max && $3!="ps"{max=$1; val=$0}END{print val}'
)

$ echo $pctd 
11.1
$ echo $pid
1234
$ echo $proc 
process-name

より安定した方法、使用することですtop

top -b -n1 | awk '/ PID /{p=1;next} p && !/top/{print $9, $12;exit}'

関連情報