systemctl — systemd-Dienste und Units steuern

Praxis-Guide zu systemctl: Dienste starten, stoppen, aktivieren und überwachen, Units und Targets verwalten und den Systemzustand steuern.

systemctl ist das zentrale Werkzeug, um den systemd-Init- und Service-Manager zu steuern – von einzelnen Diensten bis zum gesamten Systemzustand. Du startest, stoppst und lädst Dienste neu, aktivierst sie für den Autostart, prüfst ihren Status und arbeitest mit Units, Targets, Timern und Logs. Dieser Guide führt dich durch die Befehle, die du im Server-Alltag wirklich brauchst – vom schnellen restart bis zur Boot-Analyse mit systemd-analyze.

Dienste steuern

systemctl start <service> — Startet einen Dienst sofort.

systemctl start nginx

systemctl stop <service> — Stoppt einen laufenden Dienst.

systemctl stop nginx

systemctl restart <service> — Stoppt und startet einen Dienst neu. Verursacht eine kurze Ausfallzeit.

systemctl restart nginx

systemctl reload <service> — Lädt die Konfiguration neu, ohne den Dienst zu stoppen (keine Ausfallzeit, sofern unterstützt).

systemctl reload nginx

systemctl reload-or-restart <service> — Lädt neu, wenn der Dienst es unterstützt, andernfalls Neustart.

systemctl reload-or-restart php-fpm

systemctl try-restart <service> — Startet einen Dienst nur neu, wenn er gerade läuft.

systemctl try-restart nginx

systemctl kill <service> — Sendet ein Signal an die Prozesse eines Dienstes. Standardsignal ist SIGTERM.

systemctl kill nginx

systemctl kill -s SIGKILL <service> — Erzwingt das Beenden eines Dienstes, indem SIGKILL an alle seine Prozesse gesendet wird.

systemctl kill -s SIGKILL stuck-service

Aktivieren & Deaktivieren (Autostart)

systemctl enable <service> — Aktiviert einen Dienst, sodass er automatisch beim Booten startet.

systemctl enable nginx

systemctl disable <service> — Deaktiviert den automatischen Start eines Dienstes beim Booten.

systemctl disable nginx

systemctl enable --now <service> — Aktiviert beim Booten und startet sofort in einem Befehl.

systemctl enable --now nginx

systemctl disable --now <service> — Deaktiviert beim Booten und stoppt sofort in einem Befehl.

systemctl disable --now nginx

systemctl is-enabled <service> — Prüft, ob ein Dienst für den automatischen Start beim Booten aktiviert ist.

systemctl is-enabled nginx

systemctl reenable <service> — Deaktiviert und aktiviert einen Dienst neu. Nützlich nach Änderungen am [Install]-Abschnitt.

systemctl reenable nginx

systemctl mask <service> — Verhindert vollständig, dass ein Dienst gestartet wird (auch manuell). Verlinkt die Unit nach /dev/null.

systemctl mask bluetooth

systemctl unmask <service> — Hebt die Maskierung auf und erlaubt wieder den Start des Dienstes.

systemctl unmask bluetooth

Status & Inspektion

systemctl status <service> — Zeigt detaillierten Status inklusive Zustand, PID, Speicherverbrauch und letzten Log-Zeilen.

systemctl status nginx

systemctl is-active <service> — Prüft, ob ein Dienst gerade läuft. Gibt active oder inactive zurück.

systemctl is-active nginx

systemctl is-failed <service> — Prüft, ob ein Dienst fehlgeschlagen ist.

systemctl is-failed nginx

systemctl show <service> — Zeigt alle Eigenschaften eines Dienstes im Format key=value.

systemctl show nginx

systemctl show <service> -p <property> — Zeigt eine bestimmte Eigenschaft eines Dienstes.

systemctl show nginx -p MainPID

systemctl show <service> -p ActiveState,SubState — Zeigt mehrere bestimmte Eigenschaften auf einmal.

systemctl show nginx -p ActiveState,SubState,MainPID

systemctl cat <service> — Zeigt den vollständigen Inhalt der Unit-Datei eines Dienstes an.

systemctl cat nginx

systemctl help <service> — Öffnet die zu einem Dienst gehörende Man-Page (falls verfügbar).

systemctl help sshd

Units auflisten

systemctl list-units — Listet alle geladenen und aktiven Units auf.

systemctl list-units

systemctl list-units --type=service — Listet nur Service-Units auf.

systemctl list-units --type=service

systemctl list-units --state=running — Listet nur derzeit laufende Units auf.

systemctl list-units --state=running

systemctl list-units --state=failed — Listet alle fehlgeschlagenen Units auf.

systemctl list-units --state=failed

systemctl list-units --all — Listet alle Units auf, auch inaktive.

systemctl list-units --all

systemctl list-unit-files — Listet alle installierten Unit-Dateien mit ihrem Aktiviert/Deaktiviert-Zustand auf.

systemctl list-unit-files

systemctl list-unit-files --type=service — Listet nur Service-Unit-Dateien mit ihrem Zustand auf.

systemctl list-unit-files --type=service

systemctl list-unit-files --state=enabled — Listet nur aktivierte Unit-Dateien auf.

systemctl list-unit-files --state=enabled

Abhängigkeiten & Reihenfolge

systemctl list-dependencies <service> — Zeigt einen Baum der Units, von denen ein Dienst abhängt.

systemctl list-dependencies nginx

systemctl list-dependencies <service> --reverse — Zeigt, welche Units von diesem Dienst abhängen (ihn benötigen).

systemctl list-dependencies nginx --reverse

systemctl list-dependencies <service> --before — Zeigt Units, vor denen dieser Dienst startet.

systemctl list-dependencies nginx --before

systemctl list-dependencies <service> --after — Zeigt Units, nach denen dieser Dienst startet.

systemctl list-dependencies nginx --after

Unit-Dateien verwalten

systemctl edit <service> — Erstellt eine Drop-in-Override-Datei für einen Dienst (öffnet den Editor). Änderungen überstehen Paket-Updates.

systemctl edit nginx

systemctl edit --full <service> — Bearbeitet die vollständige Unit-Datei direkt (kein Drop-in). Overrides überstehen Paket-Updates NICHT.

systemctl edit --full nginx

systemctl daemon-reload — Lädt die systemd-Manager-Konfiguration neu, nachdem Unit-Dateien geändert wurden. Nach jeder manuellen Änderung erforderlich.

systemctl daemon-reload

systemctl revert <service> — Entfernt alle lokalen Anpassungen (Drop-ins) und stellt die Hersteller-Unit-Datei wieder her.

systemctl revert nginx

systemd-analyze verify <unit_file> — Prüft eine Unit-Datei auf Syntaxfehler und häufige Probleme.

systemd-analyze verify /etc/systemd/system/my-app.service

Timer (Cron-Ersatz)

systemctl list-timers — Listet alle aktiven Timer mit ihren nächsten und letzten Auslösezeiten auf.

systemctl list-timers

systemctl list-timers --all — Listet alle Timer auf, auch inaktive.

systemctl list-timers --all

systemctl start <timer> — Startet einen Timer sofort.

systemctl start backup.timer

systemctl enable --now <timer> — Aktiviert einen Timer dauerhaft über Neustarts hinweg und startet ihn jetzt.

systemctl enable --now backup.timer

systemctl status <timer> — Zeigt den Timer-Status inklusive des nächsten geplanten Laufs.

systemctl status backup.timer

systemd-analyze calendar '<expression>' — Testet und parst einen Kalenderausdruck, um zu sehen, wann er auslösen würde.

systemd-analyze calendar 'Mon..Fri *-*-* 06:00:00'

systemd-run --on-calendar='<expression>' <command> — Erstellt einen transienten Timer, der einen Befehl nach Zeitplan ausführt.

systemd-run --on-calendar='*-*-* 02:00:00' /usr/local/bin/backup.sh

systemd-run --on-active=<time> <command> — Erstellt einen transienten Timer, der einmalig nach einer Verzögerung läuft.

systemd-run --on-active=30m /usr/local/bin/cleanup.sh

Journalctl (Logs)

journalctl -u <service> — Zeigt alle Log-Einträge für einen bestimmten Dienst.

journalctl -u nginx

journalctl -u <service> -f — Folgt der Live-Log-Ausgabe eines Dienstes (tail).

journalctl -u nginx -f

journalctl -u <service> -n <lines> — Zeigt nur die letzten N Log-Zeilen eines Dienstes.

journalctl -u nginx -n 50

journalctl -u <service> --since '<time>' — Zeigt Logs seit einem bestimmten Zeitpunkt.

journalctl -u nginx --since '1 hour ago'

journalctl -u <service> --since '<start>' --until '<end>' — Zeigt Logs innerhalb eines Zeitraums.

journalctl -u nginx --since '2024-01-01' --until '2024-01-02'

journalctl -u <service> -p <priority> — Filtert Logs nach Priorität: emerg, alert, crit, err, warning, notice, info, debug.

journalctl -u nginx -p err

journalctl -u <service> -o json-pretty — Gibt Logs im hübsch formatierten JSON-Format aus.

journalctl -u nginx -o json-pretty

journalctl -u <service> --no-pager — Gibt Logs ohne Pager aus (nützlich zum Weiterleiten in Pipes).

journalctl -u nginx --no-pager | grep error

journalctl -b — Zeigt alle Logs des aktuellen Boots.

journalctl -b

journalctl -b -1 — Zeigt Logs des vorherigen Boots.

journalctl -b -1

journalctl --list-boots — Listet alle aufgezeichneten Boot-Sitzungen auf.

journalctl --list-boots

journalctl --disk-usage — Zeigt, wie viel Speicherplatz die Journal-Logs belegen.

journalctl --disk-usage

journalctl --vacuum-size=<size> — Reduziert den Journal-Log-Speicher auf eine maximale Größe.

journalctl --vacuum-size=500M

journalctl --vacuum-time=<time> — Entfernt Journal-Einträge, die älter als die angegebene Zeit sind.

journalctl --vacuum-time=30d

Systemzustand & Targets

systemctl get-default — Zeigt das Standard-Boot-Target (z. B. graphical.target, multi-user.target).

systemctl get-default

systemctl set-default <target> — Legt das Standard-Boot-Target fest.

systemctl set-default multi-user.target

systemctl isolate <target> — Wechselt sofort zu einem anderen Target (wie ein Runlevel-Wechsel).

systemctl isolate multi-user.target

systemctl list-units --type=target — Listet alle aktiven Targets auf.

systemctl list-units --type=target

systemctl reboot — Startet das System neu.

systemctl reboot

systemctl poweroff — Fährt das System herunter und schaltet es aus.

systemctl poweroff

systemctl suspend — Versetzt das System in den Bereitschaftsmodus (Suspend-to-RAM).

systemctl suspend

systemctl hibernate — Versetzt das System in den Ruhezustand (Suspend-to-Disk).

systemctl hibernate

Analyse & Performance

systemd-analyze — Zeigt, wie lange der Systemstart gedauert hat (Kernel + Userspace).

systemd-analyze

systemd-analyze blame — Listet alle Dienste nach Startzeit auf, langsamste zuerst.

systemd-analyze blame

systemd-analyze critical-chain — Zeigt die kritische Kette der Units, die den Boot am stärksten verzögert haben.

systemd-analyze critical-chain

systemd-analyze critical-chain <service> — Zeigt die kritische Kette für einen bestimmten Dienst.

systemd-analyze critical-chain nginx.service

systemd-analyze plot > boot.svg — Erzeugt eine SVG-Grafik des Boot-Vorgangs zur visuellen Analyse.

systemd-analyze plot > boot.svg

systemd-analyze security <service> — Analysiert die Sicherheits- und Sandboxing-Einstellungen eines Dienstes.

systemd-analyze security nginx

Nutzerdienste

systemctl --user start <service> — Startet einen Dienst auf Nutzerebene (kein root erforderlich).

systemctl --user start my-app

systemctl --user enable --now <service> — Aktiviert und startet einen Dienst auf Nutzerebene.

systemctl --user enable --now my-app

systemctl --user status <service> — Zeigt den Status eines Dienstes auf Nutzerebene.

systemctl --user status my-app

systemctl --user list-units --type=service — Listet alle Dienste auf Nutzerebene auf.

systemctl --user list-units --type=service

systemctl --user daemon-reload — Lädt die systemd-Konfiguration auf Nutzerebene neu, nachdem Unit-Dateien bearbeitet wurden.

systemctl --user daemon-reload

loginctl enable-linger <user> — Erlaubt, dass Nutzerdienste auch laufen, wenn der Nutzer nicht angemeldet ist.

loginctl enable-linger deploy

Fazit

systemctl bündelt die komplette Dienststeuerung unter systemd in einem konsistenten Kommando – im Alltag kommst du mit start, stop, restart, reload und status schon sehr weit. Wichtig ist der Unterschied zwischen enable/disable (Autostart beim Booten) und start/stop (sofortige Wirkung jetzt); enable --now kombiniert beides in einem Schritt. Nach jeder Änderung an Unit-Dateien gehört ein systemctl daemon-reload dazu, und list-units --failed zeigt dir schnell, was hakt. Sei vorsichtig bei kritischen Diensten: Ein stop, disable oder mask an sshd oder am Netzwerk kann auf einem entfernten Server den Zugang oder den nächsten Boot kappen. Auch reboot, poweroff und isolate greifen tief ins System ein – und die meisten Schreibaktionen brauchen sudo. Eigene Nutzerdienste verwaltest du ganz ohne root mit systemctl --user.

Verwandte Kommandos

  • journalctl – Logs von systemd-Diensten und dem Journal abfragen
  • loginctl – Nutzer-Sitzungen und Logins von systemd-logind verwalten
  • hostnamectl – Hostnamen und Systeminformationen über systemd abfragen und setzen