Prozesse

Siehe auch

Es existieren verschiedene Prozesstypen:

  • Interaktive Prozesse: z.B. die Bash, Firefox u.a.

  • Batch-Prozesse: automatische Prozesse, die zeitlich gesteuert laufen, z.B. updatedb

  • Daemons: ständig laufende Server-Prozesse

  • Threads: Lightweight-Prozesse, die unter dem Schirm eines Hauptprozesses laufen

  • Kernel Threads: hier ist in der Regel kein Einfluss durch den Benutzer möglich

Die wichtigsten Befehle, um Prozesse zu identifizieren, sind top und ps.

ps gibt einmalig, top dynamisch alle drei Sekunden eine aktuelle Liste der laufenden Prozesse inkl. Prozessorauslastung und Speicherbelegung aus.

ps, pstree

Mittels ps erfährt man unter anderem die Prozess-ID (PID), den Speicherverbrauch (Size) oder das Terminal, in dem der Prozess gestartet wurde (TTY). Die PID wird später benötigt, um einen Prozess mit den Kommandos kill oder killall zu beenden oder dessen Priorität über renice zu ändern.

Im Umgang mit ps hilft grep, um nach spezifischen Informationen zu suchen. Optionen werden ps üblicherweise im BSD-Stil übergeben, daher fehlen die führenden Minuszeichen (siehe auch man ps). Nachfolgend ein paar Beispiele:

Tipp

Prozessnamen in eckigen Klammern sind Kernel-Prozesse.

Gibt die Prozesse des aktuellen Benutzers aus:

ps

Gibt eine sehr ausführliche Liste aller Prozesse und Benutzer zurück:

ps aux

Gibt eine Liste aller Prozesse zurück, die „sbin“ im Namen enthalten:

ps aux | grep sbin

Anzahl der Prozesse zählen:

# this is ugly:
ps aux | grep duplicity | wc -l

# use this:
pgrep --count duplicity

Wie ps aux, aber mit weniger und anders angeordneten Spalten (-e zeigt alle Prozesse an, -o user-defined Format, :25 gibt der Spalte 25 Zeichen Platz):

ps -eo stat,pid,command:25,rss

Tipp

ps gibt die „Real-memory (resident set) size“ (RSS) Grössenangabe in KByte zurück.

Gibt eine nach Memory-Verbrauch aufsteigend sortierte Liste der Prozesse zurück, sowie nur ausgewählte Spalten:

ps -eo user,pid,%mem,command --sort=%mem

Die Bedeutung der Bezeichner in der STAT-Spalte:

+    is in the foreground process group
<    high-priority (not nice to other users)
D    uninterruptible sleep (usually IO)
I    Idle kernel thread
L    has pages locked into memory (for real-time and custom IO)
l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
N    low-priority (nice to other users)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
s    is a session leader
t    stopped by debugger during the tracing
T    stopped by job control signal
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

pstree gibt Prozesshierarchien und -abhängigkeiten aus. Wiederholt vorkommende Prozesse werden zusammengefasst, Threads werden in geschweiften Klammern dargestellt.

top/htop

top ist ein interaktives Tool, um die Rechnerauslastung und Prozessliste anzeigen. Die ersten Zeilen der Ausgabe bedeuten:

1top - 20:47:30 up 3 days,  5:12,  1 user,  load average: 0.92, 0.61, 0.57
2Tasks: 393 total,   1 running, 391 sleeping,   0 stopped,   1 zombie
3%Cpu(s):  3.3 us,  1.3 sy,  0.0 ni, 94.6 id,  0.0 wa,  0.5 hi,  0.2 si,  0.0 st
4MiB Mem :  15572.5 total,   1171.6 free,  10652.6 used,   3748.3 buff/cache
5MiB Swap:  16036.0 total,  14716.0 free,   1320.0 used.   3027.2 avail Mem
  • Zeile 1: Uptime, Anzahl eingeloggter Benutzer, durchschnittlicher Load (aktuell, 5 Minuten-Schnitt, 15 Minuten-Schnitt)

  • Zeile 2: Gesamtzahl Prozesse, Anzahl laufender, schlafender, gestoppter und Zombie-Prozesse

  • Zeile 3: Nutzung der CPU-Zeit zwischen User-, System-, Nice-, Idle-, wartenden, Hardware-Interrupt- und Software-Interrupt-Prozessen

  • Zeile 4/5: Memory-Verbrauch. Sobald das System häufiger swappt, sollte der Hauptspeicher aufgerüstet werden.

Fun Fact: Die Manpage zu top zählt zu den ausführlicheren Vertretern ihrer Art - sie hat einen Umfang von ca. 40 DIN A4-Seiten.

Tipp

Die Load beschreibt, wie stark ein System in der Summe ausgelastet ist (CPU, Memory, Disk I/O usw.). Auf einem Single-Core-System bedeutet eines Load von 1.00 eine 100%ige-Auslastung.

  • Load15 < 0.7: OK

  • Load15 > 0.7: CAREFUL

  • Load15 > 1: WARNING

  • Load15 > 5: CRITICAL

Was die Load verursacht? Hier kann atop helfen. Installiert wird es per yum -y install atop, der Source Code findet sich auf https://github.com/Atoptool/atop.

Um die laufende Ausgabe von top abzubrechen, q oder Ctrl + c drücken. Drückt man die Taste a, kann man das Aktualiserungsintervall von drei auf z.B. eine Sekunde ändern. c schaltet die Command-Spalte auf eine ausführliche Anzeige um und wieder zurück. Z schaltet in den Farbmodus, B schaltet Fettdruck ein/aus. M sortiert nach RAM, P nach CPU.

Der folgende Aufruf ermittelt den Systemzustand einmalig, so dass sich die Ausgabe in eigenen Skripten verwenden lässt:

top -b1n

Besser: wer top nicht so richtig schön findet und es gerne ein wenig komfortabler und hübscher in der Kommandozeile hat, installiert sich htop aus dem EPEL-Repository:

yum -y install htop
htop

free

Neben top kann man mit free --mega die Speicherauslastung des Systems in Megabytes anzeigen lassen. Unter CentOS 7 ist der Wert in der letzten Spalte „available“ interessant.

RHEL 7+:

  • total: installierter Arbeitsspeicher

  • used: effektiv von Programmen verwendet

  • free: total - used - buff/cache

Unter RHEL 6 vereinfacht das Tool aus den 1990ern die Ausgabe allerdings zu stark, was oft zu Missverständnissen führt. Speichermanagement in Linux ist heutzutage ein komplexes Thema, daher ermittelt man dort den einigermassen korrekten Wert für freies RAM wie folgt:

free --mega
# or: free --giga
# ignore the "free" column
# free RAM = total - (buffers + cached)

Erst wenn dieser errechnete Wert für längere Zeit 1.5 bis 2 mal über dem pyhsischen RAM-Wert liegt, muss gehandelt werden.

nice, renice

Als root vergibt man Prioritäten von -20 (realtime) über 0 (Standard-Prio) bis 19 (hochgradig nice: Prozess wird nur abgearbeitet, wenn das System idle ist). Ein Standard-Benutzer kann Prioritäten von 0 bis 19 in Schritten von +/-1 für seine eigenen Prozesse vergeben.

Bemerkung

Es gilt: je netter der Prozess, je höher also sein Nice-Wert ist, desto geringer ist die Prozess-Priorität.

Ein Kommando mit niedrigster Priorität starten:

nice --adjustment 19 unzip test.zip

Priorität des Prozesses „13724“ auf 2 ändern:

renice 2 13724

# if your script should renice itself, get its PID like so:
renice 2 $$

Prozesse mit höchster Priorität sind Systemprozesse wie kworker, md oder xfs - also meistens Prozesse, die mit Festplatten und Dateisystemen zu tun haben.

ionice: Beispielsweise soll mein Backup-Tool nur dann auf die Disk zugreifen, wenn kein anderer Prozess nach I/O fragt, und sich insgesamt anständg benehmen - also mit hohem „Nice“-Wert arbeiten:

ionice --class 3 nice --adjustment=19 mybackuptool ...

kill, killall

Listet die möglichen Kill-Signale auf:

kill -l

Einige wenige Signale wie SIGKILL (9), SIGCONT (18) oder SIGSTOP (19) können von Programmen nicht geblockt oder behandelt werden - sie werden vom Betriebssystem durchgesetzt. Andere können von Programmen empfangen und behandelt oder ignoriert werden.

Die Signalnummern können von Plattform zu Plattform variieren, die Signal-Namen nicht. Keyboard-Signale treffen Vordergrund-Prozesse; Prozesse im Hintergrund erhalten per kill-Komamndo ein Signal. Die wichtigsten sind:

Nr

Kurzname

Definition

Zweck

1

HUP

Hangup

Terminal wurde beendet, oder Prozess soll Konfiguration ohne Neustart einlesen

2

INT

Kbd interr.

Ctrl + c (Abbruch)

3

QUIT

Kbd quit

Ctrl + \ (Abbruch mit Prozess-Dump)

9

KILL

Kill

Prozess wird sofort beendet

15

TERM

Terminate

Prozess wird gebeten, aufzuräumen und sich und Kind-Prozesse zu beeenden. Default-Signal.

18

CONT

Continue

Pausierter Prozess wird fortgesetzt

19

STOP

Stop

Pausiert den Prozess

20

TSTP

Kbd stop

Ctrl + z (pausiert den Prozess)

Diese Aufrufe sind äquivalent:

kill 13724
kill -15 13724
kill -TERM 13724
kill -SIGTERM 13724

Prozesse versucht man möglichst in dieser Abfolge zu beenden:

  1. SIGTERM

  2. SIGKILL

Falls sich der Prozess mit der Prozess-ID „13724“ also nicht über den Aufruf kill 13724 beenden lässt, kann das Senden des Terminierungssignals SIGKILL (9) helfen. Achtung: hilft auch das nicht, muss der Server neu gestartet werden, um den resultierenden untoten Zombie-Prozess endgültig zu eliminieren.

# symbolic signal names are standardized across all hardware platforms
kill -SIGKILL 13724
# this is the same, but may be different on other hardware platforms
kill -9 13724

Prozess mit dem Namen /usr/bin/python many parameters here beenden:

kill $(pidof /usr/bin/python)

Beendet alle Prozesse namens „java“:

killall java

pkill kann Prozesse nicht nur über deren PID, sondern auch über den Namen, über dessen UID/GID etc. finden. Einen ausgewählten Benutzer abmelden (dessen Session killen):

pkill --signal SIGKILL --euid $USER

time

Ausführungsdauer des Befehls find / -name log messen:

time find / -name log

Ausgabe:

  • real: reale Zeit, die der Befehl benötigt hat

  • user: CPU-Zeit im Userspace

  • sys: CPU-Zeit für Kernel-Calls

Ist die real-Zeit grösser als die user-Zeit, handelt es sich um einen Single-Thread-Prozess. Ist die user-Zeit grösser als die real-Zeit, wurde die eigentliche Ausführung (user) auf mehrere Cores verteilt (real).

Bemerkung

Nur Fedora bringt bei Aufruf von man time die Manpage zu time. RHEL 7 kennt keine Manpage unter diesem Namen, RHEL 8 zeigt die Manpage der „time functions for gawk“ an.

Uptime

Seit wann ist das System „up and running“?

uptime
# 15:14:20 up  1:32,  1 user,  load average: 0.00, 0.01, 0.05
uptime --pretty
# up 1 hour, 32 minutes
uptime --since
# 2015-08-12 13:41:38

Built on 2022-06-03