Antworten:
Versuche dies:
ps o state,command axh | grep "^[SD]" | cut -b 3-
zum Auflisten von Befehlen von Prozessen mit einem unterbrechbaren und unterbrechungsfreien Ruhezustand.
ps
Gibt nur den Status und die Befehle aller Prozesse aus ( ax
) und h
entfernt die Kopfzeile.grep
filtert andere Prozesse als die beiden Schlafzuständecut
wird verwendet, um die Statusausgabe wieder zu entfernen.command
mit , ucmd
wenn Sie den vollständigen Namen nicht brauchen alle Argumente einschließlich.Dies ist hier wahrscheinlich ein suboptimales Skript, aber ich konnte keinen schnellen Weg finden, um ps
nach einem bestimmten Status zu filtern.
Sie können die Informationen von oben abrufen, die im Batch-Modus ausgeführt werden können ( -b
).
top -bn1 | awk 'NR > 7 && $8 ~ /S|D/ { print $12 }'
-n1
top läuft nur einmal und geht.NR > 7
Überspringt den Header.$8 ~ /S|D/
Wählt Programme aus, die sich im Status D
oder befinden S
.Mögliche Zustände sind top(1)
:
'D' = ununterbrochener Schlaf 'R' = läuft 'S' = schlafen 'T' = verfolgt oder gestoppt 'Z' = Zombie
cut -c40-41,62-
anstelle voncut -c40-41,63-
awk
.
ps -e S
zeigt Ihnen Schlafprozesse.
-e
Option bereitgestellt wird .
-e
Fall ist. S
lautet: "Fassen Sie einige Informationen wie die CPU-Auslastung von toten untergeordneten Prozessen in die übergeordneten Prozesse zusammen." Nichts in dieser Befehlszeile filtert nicht schlafende Prozesse heraus.
Verwenden von awk
undps
ps o pid,state,command | \
awk ' {if ($2 == "T") {printf "%s\t%s\t%s\n","Sleeping",$1,$3};}'
Beispiel
Starten Sie mc
in einem Terminal, öffnen Sie ein neues Terminal und starten Sie die folgenden Befehle
kill -STOP $(pgrep mc)
ps o pid,state,command | \
awk ' {if ($2 == "T") {printf "%s\t%s\t%s\n","Sleeping",$1,$3};}'
Ausgabe ist
Sleeping 21668 mc