Modul 6 · 6.1
Deutsch
Dienste mit systemd verwalten
Modul 6: Dienste und Logs · Lesezeit: 10 Minuten
Lernziel: Nach dieser Lektion können Sie Dienste starten, stoppen, neu laden und beim Hochfahren automatisch starten lassen, den Status eines Dienstes lesen und eine Einstellung eines Dienstes mit einem Drop-in sicher anpassen.
Kernbegriffe: systemd, Unit, Service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, Drop-in, systemctl edit, daemon-reload, Restart=
Wer hält alles am Laufen?
Auf einem Server laufen Dutzende Programme, die immer verfügbar sein müssen: der SSH-Server, der Webserver, eine Datenbank, die Zeitsynchronisation. Solche Programme heißen Dienste (Services oder Daemons). Jemand muss sie beim Hochfahren starten, überwachen und neu starten, wenn sie abstürzen. Unter Debian, Ubuntu, AlmaLinux und Rocky Linux übernimmt das systemd. Es ist das erste Programm, das der Kernel startet (Prozess 1), und es startet danach alles andere.
systemd arbeitet mit Units: Beschreibungen von etwas, das es verwalten soll. Die wichtigsten Arten:
| Art | Endung | Beispiel |
|---|---|---|
| Dienst | .service | nginx.service, ssh.service |
| Timer (geplante Aufgabe) | .timer | apt-daily.timer (Lektion 4.2, Lektion 6.3) |
| Socket | .socket | ssh.socket unter Ubuntu 24.04 und neuer |
| Ziel (Gruppe von Units) | .target | multi-user.target |
Mit systemd kommunizieren Sie über den Befehl systemctl. Die Endung .service dürfen Sie weglassen: systemctl status nginx ist dasselbe wie systemctl status nginx.service.
Den Status lesen
Der Befehl, den Sie am häufigsten verwenden:
anna@web1:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-11-09 08:12:44 CET; 3h 2min ago
Docs: man:nginx(8)
Process: 902 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 905 (nginx)
Tasks: 3 (limit: 2275)
Memory: 4.1M (peak: 6.3M)
CPU: 213ms
CGroup: /system.slice/nginx.service
├─905 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─906 "nginx: worker process"
nov 09 08:12:44 web1 systemd[1]: Starting nginx.service - A high performance web server...
nov 09 08:12:44 web1 systemd[1]: Started nginx.service - A high performance web server...Lesen Sie die Ausgabe von oben nach unten:
- Der Punkt vor dem Namen ist grün bei einem laufenden Dienst, weiß bei einem gestoppten und rot bei einem fehlgeschlagenen.
- Loaded zeigt, wo die Unit-Datei liegt und ob der Dienst beim Hochfahren startet (
enabled) oder nicht (disabled). - Active zeigt, ob er gerade läuft (
active (running)), gestoppt ist (inactive (dead)) oder fehlgeschlagen ist (failed), und seit wann. - Main PID und CGroup zeigen, welche Prozesse zum Dienst gehören.
- Ganz unten stehen die letzten Zeilen aus dem Log des Dienstes. Oft steht dort schon, warum etwas schiefgeht; mehr lesen Sie mit
journalctl(Lektion 6.2).
Starten, stoppen, neu starten und neu laden
anna@web1:~$ sudo systemctl start nginx # jetzt starten
anna@web1:~$ sudo systemctl stop nginx # jetzt stoppen
anna@web1:~$ sudo systemctl restart nginx # stoppen und wieder starten
anna@web1:~$ sudo systemctl reload nginx # Konfiguration neu einlesen, ohne zu stoppenDer Unterschied zwischen restart und reload ist in der Praxis wichtig. Bei einem Restart stoppt der Dienst kurz: Laufende Verbindungen werden getrennt, und wenn die neue Konfiguration einen Fehler enthält, startet er nicht mehr und Ihre Website ist offline. Bei einem Reload liest der Dienst seine Konfiguration neu ein, während er weiterläuft; bei einem Fehler in der Konfiguration behält nginx die alte. Verwenden Sie für nginx, Caddy, SSH und fail2ban nach einer Konfigurationsänderung also reload, und testen Sie die Konfiguration vorher (nginx -t, sshd -t, fail2ban-client -t). Nicht jeder Dienst unterstützt reload; systemctl reload-or-restart wählt selbst.
Beim Hochfahren: enable und disable
Starten und „beim Hochfahren starten“ sind zwei verschiedene Dinge:
anna@web1:~$ sudo systemctl enable nginx # startet ab jetzt beim Hochfahren
anna@web1:~$ sudo systemctl disable nginx # nicht mehr beim Hochfahren
anna@web1:~$ sudo systemctl enable --now nginx # beides: jetzt starten und beim Hochfahren
anna@web1:~$ systemctl is-enabled nginx
enabledEin klassischer Fehler: Sie starten einen Dienst mit start, alles funktioniert, und nach dem nächsten Neustart (zum Beispiel wegen eines Kernel-Updates, Lektion 4.2) ist er weg. Verwenden Sie für einen neuen Dienst deshalb enable --now.
Möchten Sie sicherstellen, dass ein Dienst nie startet, auch nicht, wenn ein anderer Dienst ihn anfordert, gibt es mask: sudo systemctl mask <dienst>. Rückgängig machen Sie das mit unmask.
Was ist kaputt?
Ein einziger Befehl zeigt alle fehlgeschlagenen Units:
anna@web1:~$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● php8.4-fpm.service loaded failed failed The PHP 8.4 FastCGI Process Manager
1 loaded units listed.Machen Sie daraus eine Gewohnheit, zum Beispiel nach jedem Neustart und jedem Upgrade (Lektion 4.3): Die Liste sollte leer sein. Nach der Behebung entfernen Sie die Meldung mit sudo systemctl reset-failed.
Eine Übersicht aller laufenden Dienste:
anna@web1:~$ systemctl list-units --type=service --state=runningLäuft etwas, das Sie nicht kennen oder nicht nutzen, finden Sie heraus, was es ist. Jeder Dienst, der nicht benötigt wird, ist überflüssige Angriffsfläche (Lektion 5.1 und 10.1).
Unit-Dateien und Drop-ins
Eine Unit-Datei ist eine Textdatei. Die Version des Pakets liegt in /usr/lib/systemd/system/ (auf älteren Systemen /lib/systemd/system/). Diese Datei ändern Sie nie: Ein Update des Pakets überschreibt sie. Eigene Änderungen gehören in ein Drop-in: eine kleine Datei, die nur die Zeilen enthält, die Sie ändern möchten. Am einfachsten geht das mit:
anna@web1:~$ sudo systemctl edit nginxEs öffnet sich ein Editor mit einem leeren Bereich zwischen zwei Kommentarzeilen. Was Sie dort eintragen, landet in /etc/systemd/system/nginx.service.d/override.conf. Zum Beispiel: nginx automatisch neu starten, wenn er unerwartet stoppt.
[Service]
Restart=on-failure
RestartSec=5sNach dem Speichern lädt systemctl edit die Konfiguration von systemd automatisch neu. Bearbeiten Sie eine Unit-Datei auf andere Weise, führen Sie selbst Folgendes aus:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxdaemon-reload lässt systemd die Unit-Dateien neu einlesen; der Dienst selbst muss danach noch neu gestartet werden, um die Änderung zu übernehmen. Das vollständige Ergebnis (Original plus Drop-ins) sehen Sie mit systemctl cat nginx.
Restart=on-failure ist eine gute Gewohnheit für wichtige Dienste. Verdecken Sie damit aber keinen echten Fehler: Ein Dienst, der alle fünf Sekunden abstürzt und neu startet, gehört im Log untersucht. systemd hört nach einigen schnell aufeinanderfolgenden Fehlschlägen mit dem Neustarten auf (die Standardgrenze liegt bei fünf Starts innerhalb von zehn Sekunden) und setzt den Dienst auf failed.
Unter AlmaLinux und Rocky Linux
systemd und systemctl funktionieren genau gleich. Nur die Namen der Dienste unterscheiden sich manchmal: Der SSH-Dienst heißt sshd, der Webserver der Distribution heißt httpd (Apache) oder nginx, und die Firewall firewalld.
In der Praxis
Die VPS-Oberfläche Ihres Anbieters (bei WebOké und anderswo) kann den gesamten Server ausschalten, neu starten oder „hart ausschalten“. Letzteres entspricht dem Ziehen des Steckers: Dienste haben keine Gelegenheit, sauber zu beenden, und eine Datenbank kann dabei beschädigt werden. Verwenden Sie innerhalb des Servers sudo systemctl reboot oder sudo shutdown -h now und im Panel die normale Schaltfläche zum Herunterfahren oder Neustarten.
Zusammenfassung
- systemd startet und überwacht alle Dienste; Sie bedienen es mit
systemctl. systemctl statuszeigt, ob ein Dienst läuft, ob er beim Hochfahren startet, und die letzten Logzeilen.start/stop/restartgelten für jetzt,enable/disablefür das Hochfahren; verwenden Sieenable --nowfür einen neuen Dienst.- Nach einer Konfigurationsänderung: erst testen, dann
reload;systemctl --failedsollte leer sein. - Ändern Sie nie die Unit-Datei eines Pakets, sondern verwenden Sie ein Drop-in mit
systemctl edit.
Quiz
Aufgabe
Aufgabe O6.1: Ihre Dienste im Überblick. Erstellen Sie auf Ihrem Server eine Liste aller laufenden Dienste (systemctl list-units --type=service --state=running) und prüfen Sie, ob systemctl --failed leer ist. Notieren Sie zu jedem Dienst, was er tut und ob Sie ihn benötigen. Finden Sie für einen Dienst, den Sie nicht kannten, heraus, was er ist (systemctl status, man). Setzen Sie danach für einen wichtigen Dienst Restart=on-failure in einem Drop-in und prüfen Sie mit systemctl cat, dass die Einstellung vorhanden ist.
Aufgabe O6.1: Ihre Dienste im Überblick
Diese Aufgabe machen Sie selbst; niemand prüft sie nach. Haken Sie ab, was Sie erledigt haben, und markieren Sie die Aufgabe als erledigt.
Ein Drop-in liegt in /etc/systemd/system/<naam>.service.d/override.conf, nicht in /usr/lib/systemd. Bei reload läuft der Dienst weiter, und nginx zum Beispiel behält bei einem Fehler die alte Konfiguration; testen Sie vorher mit nginx -t oder sshd -t. Überflüssige Dienste: disable --now oder das Paket entfernen.
Ihre Haken und Notizen bleiben nur in diesem Browser; wir senden sie nirgendwohin. Sind Sie angemeldet, speichern wir in Meine Kurse nur, dass Sie die Aufgabe erledigt haben.
Weiterführende Informationen
- Handbuch
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Handbuch
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Handbuch
systemd.unit(5)(Drop-ins): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
