5.4    Prozessadministration

Im letzten Abschnitt dieses Kapitels beschäftigen wir uns mit der Administration von Prozessen. Ein sehr wichtiges administratives Programm (nämlich kill) kennen Sie bereits. Die folgenden Programme dienen primär dazu, sich einen Überblick über die laufenden Prozesse zu verschaffen.

5.4.1    Prozesspriorität

Bei der Berechnung der Prozesspriorität spielt vor allem der sogenannte Nice-Wert eines Prozesses eine wichtige Rolle. Je nachdem, wie hoch (oder niedrig) dieser Nice-Wert ist, desto niedriger (bzw. höher) ist die Wahrscheinlichkeit, dass ein Prozess mit mehr CPU-Zeit beglückt wird.

Nice-Werte können zwischen --20 und 19 variieren, wobei --20 für die höchste zu vergebende Priorität steht.

Das Sonderrecht des Superusers

Nur der Administrator darf die Prozesspriorität über den Nullwert steigern. Den normalen Benutzern ist es nur erlaubt, die Prozesspriorität herabzusetzen, was beispielsweise bei längeren Dateisuchen sinnvoll sein kann.

Das Kommando nice

Die Nice-Werte werden mit dem nice-Kommando gesetzt. Das Wort nice kommt aus dem Englischen und bedeutet so viel wie »nett«, und nett ist man ja, wenn man freiwillig auf Rechenzeit verzichtet. Dem Kommando wird die Priorität über den Parameter -n mitgeteilt, und das eigentliche Kommando wird nachstehend mit allen Aufrufargumenten beschrieben:

$ nice -n 19 find / -name libcurses.a >Ergebnis

Listing 5.19     nice in Aktion

Bereits laufende Prozesse

Die Priorität bereits laufender Prozesse wird mit dem renice-Kommando verändert. Dabei kann der Parameter -p die Priorität über die Prozess-ID, der Parameter -u über den Benutzernamen und der Parameter -g die Gruppe ändern.

Im folgenden Listing wird die Nice-Priorität des Prozesses mit der PID 491 um den Wert 10 verringert. Das Gleiche gilt für alle Prozesse des Benutzers nobody:

$ renice +10 -p 491 -u nobody

Listing 5.20     renice für Benutzer und PIDs

Natürlich können sich Benutzer nicht gegenseitig die Rechenzeit stehlen, indem sie die Prioritäten erhöhen. Normalerweise kann jeder Benutzer bzw. jede Benutzerin nur eigene Prozesse herabstufen. Das Heraufstufen und der Zugriff auf »fremde«, d. h. unter einer anderen User-ID laufende Prozesse sind dem Administrator root vorbehalten. Auch sollten Sie beachten, dass Sie durch Herauf- bzw. Herabsetzen von Prioritäten in Summe keine Rechenzeit gewinnen, sondern nur die Zeit für einzelne Prozesse anders verteilen.

5.4.2    pstree

Der Befehl pstree (process tree) gibt einen Prozessbaum aus. Dies ist eine nützliche Funktion, um sich einen Überblick über das Verhalten einiger Programme und deren Kindprozesse zu verschaffen. Darüber hinaus eignet es sich hervorragend, um Linux-Prozesse und ihre Hierarchie kennenzulernen.

Was ist ein hierarchischer Prozessbaum? Die Hierarchie der Prozesse kennen Sie bereits. pstree visualisiert im Prinzip diese virtuelle Ordnung in einem ASCII-Baum – jeder Zweig des Baums stammt von einem Elternprozess ab.

$ pstree
systemd-+-ModemManager-+-gdbus
        |              `-gmain
        |-NetworkManager-+-dhclient
        |                |-…
        |                `-gmain
        …
        |-2*[dbus-daemon]

Listing 5.21     pstree ohne Argumente (gekürzt)

Ein interessantes Feature, das Sie gleich im nächsten Listing sehen, ist die Gruppierung der Kindprozesse zu ihrem Elternprozess. Dies wird in der Form Parent---Anzahl*[Child] verdeutlicht, wobei Child der Name des Kindprozesses ist und Anzahl die Anzahl der parallel laufenden Kindprozesse angibt. Der systemd-Prozess hat zweimal dbus-daemon gestartet. Threads (also leichtgewichtige Prozesse, das sind sozusagen Miniprozesse innerhalb eines Prozesses) werden mit geschweiften Klammern angezeigt.

Eine ausführlichere Ausgabe erreichen Sie mit dem Parameter -a. Dies bewirkt, dass die beim Programmstart eines jeden Prozesses übergebenen Parameter mit angezeigt werden:

$ pstree -a
systemd splash
  |-ModemManager
  |   |-gdbus
  |   `-gmain
  |-NetworkManager --no-daemon
  |   |-dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper
        -pf /var/run/dhclient-enp0s3.pid -lf...
  |   |-dnsmasq --no-resolv --keep-in-foreground --no-hosts
        --bind-interfaces --pid-file=/var/run/NetworkManager/
        dnsmasq.pid--lis
…

Listing 5.22     pstree mit Detailausgabe (gekürzt)

Sofern Sie ein Terminal mit Fettschriftunterstützung verwenden, können Sie den Parameter -h (highlight) nutzen. Dieser zeigt den pstree-Prozess inklusive aller seiner Elternprozesse in Fettschrift an. Das ist eine gute Möglichkeit, die Hierarchie der Prozesse nochmals zu verinnerlichen.

Weitere wichtige Parameter sind -p für eine Ausgabe der Prozess-IDs aller Prozesse und -u für die Angabe des effektiven Benutzers eines Prozesses (sofern dieser geändert wurde). Im folgenden Beispiel läuft der Prozess VBoxClient etwa mit der Prozess-ID 2122, und der Benutzer wurde in wendzel geändert.

$ pstree -apu
systemd,1 splash
  |-ModemManager,894
  |   |-gdbus,948
  |   `-gmain,946
  |-NetworkManager,889 --no-daemon
  |   |-dhclient,7003 -d -q -sf /usr/lib/NetworkManager/...

…

  |-VBoxClient,2122,wendzel --draganddrop
  |   `-VBoxClient,2123 --draganddrop
  |       |-dndHGCM,2127
  |       `-dndX11,2129
…

Listing 5.23     pstree-Parameterkombination

5.4.3    Prozesslistung mit Details via ps

Kommen wir zu einem der wichtigsten Programme von Linux – dem ps-Kommando. ps gibt Ihnen eine Übersicht über Ihre eigenen oder auch alle laufenden Prozesse des Systems. Dabei werden diverse Prozessattribute auf Wunsch mit ausgegeben.

Die Besonderheit an der Linux-Version von ps ist, dass es sowohl die Features der SVR4- als auch die der BSD-Version von ps unterstützt. Hinzu kommen einige GNU-Features. Oftmals führen daher mehrere Parameter zum gleichen Resultat.

Bei einem parameterlosen Aufruf des Programms erscheint eine Liste aller Prozesse, die in Ihrer aktuellen Shell laufen:

$ ps
  PID TTY          TIME CMD
 8286 pts/7    00:00:00 bash
 8440 pts/7    00:00:00 ps

Listing 5.24     ps

Wie Sie sehen, erfolgt die Ausgabe in Form einer Tabelle. Die Spalte PID enthält die Prozess-ID, die TTY-Spalte gibt das Terminal an, auf dem der Prozess läuft. Die Abkürzung »TTY« geht auf die historischen Druckterminals, genannt Teletype, aus den viktorianischen Telegrafennetzen zurück.[ 23 ] TIME gibt die bereits für den Prozess aufgebrachte CPU-Zeit an. Die letzte Spalte, CMD, repräsentiert das eigentliche Kommando, also den Befehl, so wie er irgendwann einmal eingegeben wurde.

Befassen wir uns nun mit den Parametern. Der Parameter -A gibt alle momentan laufenden Prozesse aus. Der Parameter -e liefert das gleiche Ergebnis, -a zaubert lediglich eine Ausgabe aller Prozesse des Terminals hervor.

Sofern Sie sehr detaillierte Informationen zur Prozessliste benötigen, verwenden Sie den Parameter -f. Mit -l wird das »long format« benutzt. Das heißt, User-IDs werden in Benutzernamen aufgelöst, und es werden die Aufrufparameter der Prozesse angezeigt.

$ ps -lf
F S UID  PID PPID C PRI NI ADDR SZ WCHAN STIME TTY       TIME CMD
0 S sw  8286 2678 0  80  0 -  6114 wait  15:58 pts/7 00:00:00 bash
0 R sw  8449 8286 0  80  0 -  9748 -     16:09 pts/7 00:00:00 ps -lf

Listing 5.25     ps mit -f und -l

Sehr interessant sind im Übrigen einige BSD-Parameter wie u und f. Der Parameter u bewirkt die benutzerspezifische Ausgabe, gibt also Ihre eigenen Prozesse aus. f gibt den Prozessstatus in der Spalte S an und erstellt außerdem – ähnlich wie pstree, jedoch nicht so hübsch – einen Prozessbaum. Der Status wird in Form eines Großbuchstabens repräsentiert. S steht beispielsweise für Sleep, R steht für Running.

Für Individualisten gibt es noch den -o-Parameter. Er liefert eine selbst konfigurierbare Ausgabe. Dabei kann die Ausgabe in der Form »SpalteA SpalteB SpalteC« festgelegt werden. Erlaubte Schlüsselwörter zeigt Tabelle 5.1.

Schlüsselwort

Beschreibung

pcpu

CPU-Nutzung

group

Gruppenzugehörigkeit

ppid

Elternprozess-ID

user

Eigentümer

args

Parameter beim Programmaufruf

comm

Name des Prozesses

nice

Nice-Priorität

pid

Prozess-ID

pgid

Prozessgruppen-ID

time

verbrauchte Rechenzeit

tty

benutztes Terminal

Tabelle 5.1     Schlüsselwörter für den ps-Parameter -o

Probieren Sie es einmal aus. Unser Ziel ist es, alle Prozesse auszugeben, die momentan in der Prozessliste aufzufinden sind. Dabei sollen jedoch nur der Benutzername, die Prozess-ID, das Kommando selbst und das Terminal des Prozesses ausgegeben werden.

$ ps -eo "user pid comm"
USER         PID COMMAND
…    
wendzel     1891 systemd
wendzel     1892 (sd-pam)
wendzel     1897 pulseaudio
wendzel     1899 tracker-miner-f
wendzel     1903 dbus-daemon
wendzel     1905 gnome-keyring-d
wendzel     1925 gvfsd
wendzel     1930 gvfsd-fuse
wendzel     1936 gvfs-udisks2-vo
wendzel     1944 gvfs-mtp-volume
wendzel     1951 gvfs-afc-volume
wendzel     1958 kwalletd5
wendzel     1959 startplasma-x11
wendzel     1960 gvfs-gphoto2-vo
wendzel     1968 gvfs-goa-volume
wendzel     1972 goa-daemon
wendzel     1998 goa-identity-se
wendzel     2026 tracker-store
wendzel     2030 ssh-agent
wendzel     2053 start_kdeinit
wendzel     2054 kdeinit5
wendzel     2065 kded5
wendzel     2073 kaccess
wendzel     2087 kglobalaccel5
wendzel     2092 dconf-service
wendzel     2094 kactivitymanage
…

Listing 5.26     Individueller ps-Aufruf

5.4.4    top

Ein weiteres, sehr beliebtes und einfach zu handhabendes Tool zur Überwachung der Prozesse ist top. Der Unterschied zum ps-Kommando besteht darin, dass top die Prozessliste periodisch auf dem Bildschirm ausgibt und diese Ausgabe nach einigen vorgegebenen Kriterien – beispielsweise nach der CPU-Nutzung oder dem Speicherverbrauch – sortieren kann.

Nachdem Sie top gestartet haben, zeigt sich ein Header mit anschließender Prozesstabelle (siehe Abbildung 5.2). Der mehrzeilige Header enthält die Laufzeit des Systems (genannt uptime) und die aktuelle Uhrzeit, die Anzahl der momentan angemeldeten Benutzer (x users) und die durchschnittliche Anzahl der Prozesse in den letzten 1, 5 und 15 Minuten, die auf ihre Abarbeitung durch die CPU warten (load average).

top

Abbildung 5.2     top

Zeile 2 des Headers gibt die Anzahl der Prozesse und deren Status an, das heißt, wie viele dieser Prozesse gerade »schlafen«, von der CPU verarbeitet werden oder Zombie-Prozesse sind und gestoppt wurden.

Die dritte Zeile gibt Aufschluss über die Verteilung der aktuellen Rechenzeit an den Userspace (user), den Kernelspace (system) und an nice-Zeit. Die Angabe idle gibt an, zu wie viel Prozent der Zeit der Prozessor nicht ausgelastet ist.

Die Zeilen 4 und 5 informieren über den physikalischen Hauptspeicher und den Swap-Speicher. Der Wert vor av gibt den maximal verfügbaren Speicher an, used den davon momentan benutzten Teil und free den unbenutzten Anteil.

Die Ausgabe in Form einer Prozesstabelle an sich ist ähnlich wie bei ps aufgebaut und besteht im Prinzip aus den gleichen Spalten.

Rufen Sie top mit dem Parameter -i auf, um nur die derzeit laufenden Prozesse anzeigen zu lassen.

Ordnung im Chaos

Die Sortierfunktion von top wird über die Steuertasten aufgerufen. Eine Liste dieser Tasten erhalten Sie, indem Sie (H) (Help) drücken. Eine Liste der wichtigsten Sortiertasten finden Sie auch in Tabelle 5.2.

Taste

Funktionalität

N

absteigende Sortierung nach Prozess-ID

P

absteigende Sortierung nach CPU-Nutzung

M

absteigende Sortierung nach Speichernutzung

T

absteigende Sortierung nach bisheriger Beanspruchung von CPU-Zeit

Tabelle 5.2     Funktionstasten für die Sortierung der Prozessliste

5.4.5    Timing für Prozesse

Das Kommando time wird in Verbindung mit einem Programm aufgerufen. Nach Beendigung dieses Prozesses werden seine gesamte Laufzeit und die verbrauchte CPU-Zeit im Kernelspace (sys) und im Userspace (user) ausgegeben. time ist zwar kein richtiger Benchmark, aber wenn Sie wissen wollen, wie schnell Ihr Rechner eine Aufgabe bewältigen kann, erhalten Sie so die passenden Informationen.

$ time find /usr/bin -name gedit
/usr/bin/gedit
real	0m0.015s
user	0m0.008s
sys	0m0.004s

Listing 5.27     time