top を使用せずに、top によって提供されるシステム タスクの概要を取得するにはどうすればよいですか?

top を使用せずに、top によって提供されるシステム タスクの概要を取得するにはどうすればよいですか?

top はサマリーに次の数値を表示します:

タスク: 合計 193、実行中 1、スリープ中 192、停止中 0、ゾンビ 0

プログラムを実行し、/proc ファイルを解析するなど、他の方法でそれらを取得する方法を探しています。

それらの数字を取得する方法を知っていますか?

私が得た最も近いものは次のとおりです。

pgrep "" -c
192

そしてtopとpgrep:

top -b -n 1 | head -n 2 | tail -n 1; pgrep "" -c

決して同意しません...

例: 194 対 191

grep 'procs' /proc/stat
procs_running 2
procs_blocked 0

そして、ここでは走っている、眠っている、止まっている、ゾンビについて言及しています: http://procps.cvs.sourceforge.net/viewvc/procps/procps/top.c?revision=1.134&view=markup#l1025

この grep で一致が見つかりました。sleeping は 192 です。

 grep -R sleeping /proc/*/status | wc -l

しかし、 sleep を実行する方法と pgrep の合計を実行する方法は一致しません。

top -b -n 1 | head -n 2 | tail -n 1; pgrep "" -c; grep "procs" /proc/stat; grep -R sleeping /proc/*/status | wc -l

答え1

 ps -eo stat | awk '/^S/ { stat+=1 } /^R/ { run +=1 } /^Z/ { zomb+=1 } { tot+=1 } END { print "sleeping = "stat" Running = "run" Zombie = "zomb" total = "tot }'

これにより、プロセスの状態情報についても同じ情報が得られます。

R は実行中のプロセス、S はスリープ中のプロセス、Z はゾンビプロセスになります。

top は、top の実際の実行を考慮するため、実行中のプロセスを常に 1 つ多く表示することに留意してください。

答え2

いくつかの例外を除いて、ps は正しい回答を返します。

local output=$(ps axo stat=)

cpu_tasks_running=$(echo -e "${output}" | grep -c  '^R')

cpu_tasks_sleeping=$(grep sleeping /proc/*/status | wc -l)
  # searching /proc gets better results than searching ps output:
  # cpu_tasks_sleeping=$(echo -e "${output}" | grep -cE '^D|^S')

cpu_tasks_stopped=$(echo -e "${output}" | grep -ci '^T')
cpu_tasks_zombie=$(echo -e "${output}" | grep -c  '^Z')

cpu_tasks_total=$(($cpu_tasks_running + $cpu_tasks_sleeping))
  # counting ps total lines never matched ps running + ps sleeping, nor top
  # replaced with math: ps running + ps sleeping
  # cpu_tasks_total=$(echo -e "${output}" | wc -l)

関連情報