top exibe esses números em seu resumo:
Tarefas: 193 no total, 1 correndo, 192 dormindo, 0 parado, 0 zumbi
Estou procurando uma maneira de obtê-los de outra maneira - executando um programa, analisando um arquivo/proc.
Você conhece uma maneira de obter esses números?
O mais próximo que consegui chegar foi:
pgrep "" -c
192
e top & pgrep:
top -b -n 1 | head -n 2 | tail -n 1; pgrep "" -c
nunca concordo...
por exemplo, 194 versus 191
grep 'procs' /proc/stat
procs_running 2
procs_blocked 0
E uma menção de correr, dormir, parar, zumbi aqui: http://procps.cvs.sourceforge.net/viewvc/procps/procps/top.c?revision=1.134&view=markup#l1025
Este grep encontrou uma correspondência, dormindo é 192:
grep -R sleeping /proc/*/status | wc -l
mas a maneira de dormir e a maneira do pgrep de fazer o total não combinam:
top -b -n 1 | head -n 2 | tail -n 1; pgrep "" -c; grep "procs" /proc/stat; grep -R sleeping /proc/*/status | wc -l
Responder1
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 }'
Isso lhe dará as mesmas informações sobre as informações do estado do processo.
R estará executando processos, S estará dormindo e Z zumbi.
Lembre-se de que top sempre mostrará mais um processo em execução, pois levará em consideração a execução real de top.
Responder2
Com algumas exceções, ps retorna as respostas corretas.
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)