Wie kann ich die Anzahl der Ruhevorgänge mithilfe eines Shell-Skripts zählen?
Wie kann ich die Anzahl der Ruhevorgänge mithilfe eines Shell-Skripts zählen?
Antworten:
Erweiterte Erklärung ... ich vertraue darauf, dass Sie alles in sich aufnehmen, da es Ihre Hausaufgaben sind ...
Listen Sie Prozesse mit dem ps
Befehl auf
$ ps
PID TTY TIME CMD
4879 pts/3 00:00:00 bash
5003 pts/3 00:00:00 ps
Oh, dies zeigt nur die Prozesse der aktuellen Sitzung. Wir wollen alle Prozesse im System zeigen. Dafür können wir die -e
Flagge benutzen
$ ps -e
PID TTY TIME CMD
1 ? 00:00:05 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
[and many more lines]
aber wie zeigen wir welche schlafen?
Sie können die -l
Option oder u
Option verwenden. Dies gibt mehr Details einschließlich des Status des Prozesses. Schlafvorgänge haben einen Buchstaben S
oder D
in der Spalte STAT
von man ps
PROCESS STATE CODES Hier sind die verschiedenen Werte, die die Ausgabespezifizierer s, stat und state (Header "STAT" oder "S") anzeigen, um den Status eines Prozesses zu beschreiben:
D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped by job control signal t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent
Wir können die ps
Ausgabe so formatieren , dass NUR die Zustände angezeigt werden, um das Zählen zu vereinfachen:
ps -e -o state
Hier erhalten wir -e
alle Prozesse und das -o
Flag, gefolgt von der Art der Ausgabe, die wir wollen. Dieser Befehl gibt nur den Statusbuchstaben aus. Wir können |
diese Ausgabe dann weiterleiten , grep
um die Zeilen mit S
oder D
den Schlafprozessen zu zählen:
ps -e -o state | grep -cE 'S|D'
grep
sucht nach Text. Die -c
Option weist es an, nur Übereinstimmungen zu zählen, anstatt den gefundenen Text selbst auszugeben. Die -E
Option weist grep
an, einen erweiterten regulären |
Ausdruck zu verwenden, damit wir die Zeichen verwenden können, um Dinge ODER Dinge mit dem Ausdruck: abzugleichen thing|stuff
. Verwenden Sie bei Verwendung von Regex einfache Anführungszeichen, um Erweiterungen durch die Shell zu verhindern.
grep -c '[SD]'
. (Jede Alternative ist nur ein einzelnes Zeichen, daher ist eine Zeichenklasse ausreichend.)
Sehr einfach, wenn Sie wissen, dass der ps
Befehl den Status für Schlafprozesse entweder S
für unterbrechbaren Schlaf oder D
für ununterbrochenen Schlaf ausgibt , und Sie können das -o s
Flag verwenden, um den Status dieser zu ermitteln. Jetzt müssen Sie nur noch die Ausgabe durchlaufen grep
, um das Auftreten dieser Flags zu zählen. Wie so:
$ ps -e -o s | grep -o 'S\|D' -c
260
Eine andere Möglichkeit besteht darin, die Anzahl der Prozesse in jedem Status mithilfe von Folgendem aufzulisten:
$ ps -e -o state | sort | uniq -c
1 R
141 S
Das top
Dienstprogramm gibt die Anzahl der Aufgaben an und zeigt an, wie viele ausgeführt werden und wie viele schlafen. Das ändert sich natürlich von Moment zu Moment, aber auch die Ausgabe eines dieser Einzeiler. Wie bei jedem * nix-Dienstprogramm wird die man
Seite detaillierter.
top
das ist einfacher als die ps
-basierte Methode in den anderen Antworten detailliert, top
ist in der Tat sehr mächtig , und Sie haben Recht , dass die Anzahl der Schlafprozesse kann von seinem Ausgang extrahiert werden. Ich schlage vor top -bn1 | sed -n 2p | grep -oP '\d+(?= sleeping)'
, obwohl es einen einfacheren Weg gibt, den ich nicht für so gut oder besser gehalten habe. Wenn Sie möchten, können Sie dies (mit oder ohne Änderung) Ihrer Antwort als Beispiel hinzufügen.