systemd & Dienste
Prozesse & System
Was ist systemd?
systemd ist auf den meisten modernen Distributionen das erste Programm, das der Kernel startet – es läuft mit der PID 1. Seine Aufgabe ist es, das System hochzufahren und alle Dienste (Daemons) zu verwalten: Webserver, Datenbanken, SSH, Netzwerk und vieles mehr. Anders als die alten Init-Skripte startet systemd Dienste parallel und mit Abhängigkeitsauflösung, wodurch der Bootvorgang deutlich schneller wird.
Units
Alles, was systemd verwaltet, ist eine Unit. Der häufigste Typ ist die .service-Unit, die einen Dienst beschreibt. Daneben gibt es .timer (zeitgesteuert), .socket, .mount und weitere. Units werden in Textdateien definiert, meist unter /etc/systemd/system/ (eigene) oder /usr/lib/systemd/system/ (vom Paket geliefert).
[Unit] Description=Meine Web-App After=network.target [Service] ExecStart=/usr/bin/python3 /opt/app/server.py Restart=on-failure User=appuser [Install] WantedBy=multi-user.target
systemctl: das zentrale Werkzeug
Mit systemctl steuerst du Dienste. Die wichtigsten Aktionen:
# systemctl start nginx # jetzt starten # systemctl stop nginx # jetzt stoppen # systemctl restart nginx # neu starten # systemctl reload nginx # Config neu laden (ohne Neustart) # systemctl status nginx # Zustand & letzte Logzeilen
Die Ausgabe von status ist besonders nützlich zur Fehlersuche:
# systemctl status nginx ● nginx.service - A high performance web server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled) Active: active (running) since Sat 2026-06-20 09:00:01; 2h ago Main PID: 812 (nginx)
enable vs. start
Ein häufiges Missverständnis: start und enable sind nicht dasselbe. start startet einen Dienst jetzt, aber nur für die aktuelle Sitzung. enable sorgt dafür, dass der Dienst beim nächsten Systemstart automatisch hochfährt – startet ihn aber nicht sofort.
| Befehl | Wirkung |
|---|---|
systemctl start X | Jetzt starten (einmalig) |
systemctl enable X | Beim Boot automatisch starten |
systemctl enable --now X | Beides gleichzeitig |
systemctl disable X | Autostart entfernen |
Targets
Targets sind Gruppen von Units und ersetzen die alten Runlevel. Das normale Mehrbenutzer-System ist multi-user.target, mit grafischer Oberfläche graphical.target. Den aktuellen Zustand zeigt:
$ systemctl get-default graphical.target $ systemctl list-units --type=target
Nach Änderungen: daemon-reload
Hast du eine Unit-Datei bearbeitet, kennt systemd die Änderung erst nach systemctl daemon-reload. Das ist eine häufige Stolperfalle.
# systemctl daemon-reload # systemctl restart meine-app
Hinweise & Sicherheit
Setze in .service-Dateien immer einen unprivilegierten User= statt Dienste als root laufen zu lassen – das begrenzt den Schaden bei einer Sicherheitslücke. Mit Optionen wie ProtectSystem=, PrivateTmp= und NoNewPrivileges= kannst du Dienste zusätzlich abschotten. Die Logs eines Dienstes liest du komfortabel mit journalctl, mehr dazu unter Logs. Wiederkehrende Aufgaben planst du mit systemd-Timern oder cron.
Welcher Befehl sorgt dafür, dass ein Dienst nach jedem Neustart automatisch startet?