Prozessverwaltung
Ein Prozess ist ein laufendes Programm. Der Unterschied ist wichtig: Ein Programm ist eine Datei auf der Festplatte (/usr/bin/bash), ein Prozess ist die lebende Instanz davon im Arbeitsspeicher – mit eigenem Speicher, eigenem Zustand und eigener Identität.
Dasselbe Programm kann gleichzeitig in mehreren Prozessen laufen – etwa wenn zwei Benutzer gleichzeitig eine Shell öffnen: zwei Prozesse, ein Programm.
PID und PPID
Abschnitt betitelt „PID und PPID“Jeder Prozess bekommt beim Start eine eindeutige PID (Process ID) – eine fortlaufende Nummer. Zusätzlich kennt jeder Prozess seine PPID (Parent PID): die PID des Prozesses, der ihn gestartet hat.
echo $$ # PID der aktuellen Shellecho $PPID # PPID der aktuellen ShellDaraus ergibt sich ein Prozessbaum: Jeder Prozess hat genau einen Elternprozess, kann aber beliebig viele Kindprozesse haben.
PID 1: der Urvater
Abschnitt betitelt „PID 1: der Urvater“Beim Systemstart ist der erste Prozess, den der Kernel startet, immer PID 1. Auf modernen Linux-Systemen ist das systemd. Alle anderen Prozesse sind direkte oder indirekte Kinder davon:
PID 1: systemd├── PID 312: sshd│ └── PID 891: sshd (Sitzung alice)│ └── PID 892: bash│ └── PID 1034: vim bericht.txt├── PID 318: cron└── PID 421: nginx ├── PID 422: nginx (worker) └── PID 423: nginx (worker)Wie Prozesse entstehen: Fork & Exec
Abschnitt betitelt „Wie Prozesse entstehen: Fork & Exec“Neue Prozesse entstehen in Linux immer nach demselben Muster:
- Fork – Ein laufender Prozess erstellt eine identische Kopie von sich selbst. Die Kopie ist der neue Kindprozess.
- Exec – Der Kindprozess ersetzt sein Programm durch ein anderes (z. B.
vim).
Wenn man in der Shell vim datei.txt eingibt, forkt die Shell sich selbst, und der Kindprozess führt dann exec vim aus. Die Shell (Elternprozess) wartet, bis vim beendet ist.
Prozesszustände
Abschnitt betitelt „Prozesszustände“Ein Prozess befindet sich zu jedem Zeitpunkt in einem von mehreren Zuständen:
fork() │ ▼ ┌─────────┐ Scheduler ┌─────────┐ │ READY │ ────────────► │ RUNNING │ │ (bereit)│ ◄──────────── │(läuft) │ └─────────┘ Zeitscheibe └────┬────┘ │ ┌───────────────────────┼───────────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │SLEEPING │ │ STOPPED │ │ ZOMBIE │ │(wartet) │ │(gestoppt)│ │(beendet, │ └──────────┘ └──────────┘ │ nicht │ │ │ │ abgeholt)│ │ Ereignis │ SIGCONT └──────────┘ └──────────────────────┘| Zustand | Bedeutung |
|---|---|
| Running | Prozess wird gerade von der CPU ausgeführt |
| Ready | Prozess ist bereit, wartet auf CPU-Zuteilung |
| Sleeping | Wartet auf ein Ereignis (Tastatureingabe, Netzwerk, Datei) |
| Stopped | Durch Signal angehalten (z. B. Strg+Z) |
| Zombie | Beendet, aber Elternprozess hat Exit-Code noch nicht abgeholt |
Das /proc-Dateisystem
Abschnitt betitelt „Das /proc-Dateisystem“Linux macht Prozessinformationen als virtuelle Dateien zugänglich – im Verzeichnis /proc. Für jeden laufenden Prozess existiert dort ein Unterverzeichnis mit seiner PID:
ls /proc/$$ # Verzeichnis der aktuellen Shellcat /proc/$$/status # Statusinfos: Name, PID, PPID, Zustand, Speichercat /proc/$$/cmdline # Mit welchem Befehl gestartet?ls /proc/$$/fd # Offene Datei-Handles (Dateideskriptoren)cat /proc/$$/status | grep -E "^(Name|Pid|PPid|State)"# Name: bash# Pid: 892# PPid: 891# State: S (sleeping)