top 在其摘要中显示这些数字:
任务:总共 193 个,1 个正在运行,192 个正在睡觉,0 个停止,0 个僵尸
我正在寻找一种方法来以其他方式获取它们——运行程序、解析 /proc 文件。
您知道获得这些数字的方法吗?
我能得到的最接近的是:
pgrep "" -c
192
以及顶部和 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 的 Total 方式并不相符:
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 的实际运行情况。
答案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)