Wie kann ich die Anzahl der Schlafvorgänge in meinem System zählen?

7

Wie kann ich die Anzahl der Ruhevorgänge mithilfe eines Shell-Skripts zählen?

aeomey amani
quelle
Ok, ich muss ein Shell-Skript mit einem Menü schreiben und eines der erforderlichen ist, dass (Schlafprozess. (Durch Ausführen dieser Aufgabe wird die Anzahl der Schlafprozesse in Ihrem System gezählt)) es sich um ein
Untermenü der Prozessverwaltung handelt

Antworten:

8

Erweiterte Erklärung ... ich vertraue darauf, dass Sie alles in sich aufnehmen, da es Ihre Hausaufgaben sind ...

Listen Sie Prozesse mit dem psBefehl 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 -eFlagge 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 -lOption oder uOption verwenden. Dies gibt mehr Details einschließlich des Status des Prozesses. Schlafvorgänge haben einen Buchstaben Soder Din 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 psAusgabe so formatieren , dass NUR die Zustände angezeigt werden, um das Zählen zu vereinfachen:

ps -e -o state

Hier erhalten wir -ealle Prozesse und das -oFlag, gefolgt von der Art der Ausgabe, die wir wollen. Dieser Befehl gibt nur den Statusbuchstaben aus. Wir können |diese Ausgabe dann weiterleiten , grepum die Zeilen mit Soder Dden Schlafprozessen zu zählen:

ps -e -o state | grep -cE 'S|D'

grepsucht nach Text. Die -cOption weist es an, nur Übereinstimmungen zu zählen, anstatt den gefundenen Text selbst auszugeben. Die -EOption weist grepan, 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.

Zanna
quelle
Ausgezeichnet. Sogar ich verstehe.
Jacob Vlijm
2
Eine weitere Option für die rechte Seite des Rohrs ist grep -c '[SD]'. (Jede Alternative ist nur ein einzelnes Zeichen, daher ist eine Zeichenklasse ausreichend.)
Eliah Kagan
5

Sehr einfach, wenn Sie wissen, dass der psBefehl den Status für Schlafprozesse entweder Sfür unterbrechbaren Schlaf oder Dfür ununterbrochenen Schlaf ausgibt , und Sie können das -o sFlag 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
Sergiy Kolodyazhnyy
quelle
1
Schön, noch nie von einem Schlafprozess gehört.
Jacob Vlijm
1

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
Pete Escalante
quelle
1
Bitte fügen Sie eine Beschreibung der Staaten hinzu. Einschließlich "I"
Philippe Delteil
0

Das topDienstprogramm 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 manSeite detaillierter.

DukeW
quelle
Obwohl ich das nicht von einer Art und Weise kennen zu tun mit , topdas ist einfacher als die ps-basierte Methode in den anderen Antworten detailliert, topist 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.
Eliah Kagan