Wie erhalte ich die von top bereitgestellte Systemaufgabenübersicht, ohne top zu verwenden?

Wie erhalte ich die von top bereitgestellte Systemaufgabenübersicht, ohne top zu verwenden?

top zeigt in seiner Zusammenfassung diese Zahlen an:

Aufgaben: 193 insgesamt, 1 läuft, 192 schläft, 0 angehalten, 0 Zombie

Ich suche nach einer anderen Möglichkeit, sie zu erhalten – durch Ausführen eines Programms, Analysieren einer /proc-Datei.

Kennen Sie eine Möglichkeit, an diese Zahlen zu kommen?

Das Beste, was ich erreichen konnte, ist:

pgrep "" -c
192

und top & pgrep:

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

stimme nie zu...

zB 194 vs 191

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

Und eine Erwähnung von Rennen, Schlafen, Anhalten, Zombie hier: http://procps.cvs.sourceforge.net/viewvc/procps/procps/top.c?revision=1.134&view=markup#l1025

Dieses Grep hat eine Übereinstimmung ergeben, sleeping ist 192:

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

aber seine Art, den Schlaf zu berechnen, und die Art und Weise, wie pgrep die Gesamtsumme berechnet, passen nicht zusammen:

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

Antwort1

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

Dadurch erhalten Sie die gleichen Informationen zum Prozessstatus.

R sind laufende Prozesse, S sind schlafende Prozesse und Z sind Zombieprozesse.

Bedenken Sie, dass „top“ immer einen laufenden Prozess mehr anzeigt, da die tatsächliche Ausführung von „top“ berücksichtigt wird.

Antwort2

Mit einigen Ausnahmen gibt ps die richtigen Antworten zurück.

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)

verwandte Informationen