Ich möchte die Anzahl der nicht schlafenden Prozesse zählen, die von einem bestimmten Benutzer gestartet wurden. Ich weiß, dass die schlafenden Prozesse diejenigen sind, deren ps
Statusvariable „S“ oder „D“ enthält. Ich weiß auch, dass ich Prozesse aus einer Liste mit Variablen zählen kann user
und state
zwar durch:
ps -e -o user,state | grep -c 'username'
Ebenso weiß ich, dass ich die Schlafvorgänge folgendermaßen zählen könnte:
ps -e -o user,state | grep -c 'S|D'
Ich kann jedoch nicht herausfinden, wie ich beide Informationen verwenden kann, um die vom Benutzer gestarteten, nicht ruhenden Prozesse zu zählen username
.
Antwort1
In der Ausgabe des Befehls
ps -e -o user,state
der Status ist das letzte Zeichen in jeder Zeile. Wir zählen also grundsätzlich die Zeilen, die den angegebenen Benutzernamen enthalten und dann weder mit einem S
noch mit einem enden D
:
ps -e -o user,state | grep -c -E 'pduck.*[^SD]$'
Dadurch werden alle Zeilen gefunden (oder gezählt), die das Wort pduck
(mein Benutzername) enthalten und nicht mit S
oder enden D
.
Dies -E
ist notwendig, um grep
den regulären Ausdruck zu verstehen.
@Stahlfahrerschlug in einem Kommentar vor,„Wählen Sie den Benutzer aus -u pduck
und lassen Sie ihn vollständig aus der Liste der Ausgabefelder weg.“. Ich stimme zu, das ist sogar noch besser, aber dann müssen wir den -e
Schalter fallen lassen, weil sonst alle Prozesse ausgewählt würden (nicht nur die des Benutzers pduck
):
ps -u pduck -o state | grep -c -E '[^SD]$'