¿Cómo obtener el resumen de tareas del sistema proporcionado por top sin usar top?

¿Cómo obtener el resumen de tareas del sistema proporcionado por top sin usar top?

top muestra estos números en su resumen:

Tareas: 193 en total, 1 en ejecución, 192 durmiendo, 0 detenidas, 0 zombis

Estoy buscando una manera de obtenerlos de otra manera: ejecutando un programa, analizando un archivo/proc.

¿Conoce alguna forma de obtener esos números?

Lo más cerca que he podido llegar es:

pgrep "" -c
192

y arriba y pgrep:

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

nunca estoy de acuerdo...

por ejemplo, 194 frente a 191

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

Y una mención de correr, dormir, detenerse, zombie aquí: http://procps.cvs.sourceforge.net/viewvc/procps/procps/top.c?revision=1.134&view=markup#l1025

Este grep encontró una coincidencia, dormir es 192:

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

pero su forma de dormir y la forma de pgrep de hacer total no cuadran:

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

Respuesta1

 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 }'

Esto le brindará la misma información sobre la información del estado del proceso.

R ejecutará procesos, S será procesos inactivos y Z zombie.

Tenga en cuenta que top siempre mostrará un proceso en ejecución más, ya que tendrá en cuenta la ejecución real de top.

Respuesta2

Con un par de excepciones, ps devuelve las respuestas correctas.

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)

información relacionada