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).
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