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:
SIGTERM
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 2024-11-18