systemctl: So steuerst du Systemd-Dienste und Einheiten
Unter Linux nimmt systemctl eine Schlüsselrolle bei der Steuerung des Init-Systems und Service-Managers systemd ein. Mit systemctl behältst du die volle Kontrolle über deine systemd-Dienste, Units und Konfigurationen – ein unverzichtbares Tool für die professionelle Systemadministration. Von der Startsteuerung bis zum Feintuning von Systemzuständen bietet dir systemctl alles, was du brauchst.
Was ist systemctl?
systemctl ist dein Kommandozeilen-Werkzeug, um systemd zu verwalten – das Herzstück vieler Linux-Betriebssysteme. systemd ist mittlerweile der Standard bei populären Linux-Distributionen bzw. Server-Betriebssystemen wie Ubuntu, Debian, Fedora, RHEL, CentOS oder Arch Linux.
Innerhalb von systemd ist systemctl für die Verwaltung von Systemdiensten, Konfigurationen, das Startverhalten und die Wartung zuständig. Dabei geht der Funktionsumfang weit über das bloße Starten von Programmen hinaus: Du steuerst damit fast jeden Aspekt deines Linux-Servers.
In diesem Guide zeigen wir dir praktische Codebeispiele und Linux-Befehle für systemctl, basierend auf Ubuntu 22.04.
Dienste effizient verwalten
Die Hauptaufgabe des Init-Systems ist es, alle Komponenten zu laden, die nach dem Booten des Linux-Kernels benötigt werden (die sogenannten „Userland“-Komponenten). Zudem steuerst du damit Dienste und Daemons während des laufenden Betriebs.
In systemd dreht sich alles um Units. Das sind Ressourcen, die vom System verwaltet werden. Jede Unit hat einen Typ (z. B. Dienst, Mount-Punkt), den du an der Dateiendung der Unit-Datei erkennst.
Besonders wichtig sind die Dienst-Units mit der Endung .service. Gut zu wissen: Bei den meisten Befehlen kannst du das Suffix einfach weglassen, da systemd automatisch erkennt, dass du einen Dienst meinst.
Dienste starten und stoppen
Das Ein- und Ausschalten von Diensten gehört zum Administrator-Alltag. So behältst du die volle Kontrolle über alle Prozesse. Um einen Dienst zu aktivieren, nutzt du start. Falls du nicht als Root eingeloggt bist, setze einfach sudo davor:
$ sudo systemctl start application.servicebashDa systemd schlau genug ist, nach .service-Dateien zu suchen, reicht auch die Kurzform:
$ sudo systemctl start applicationbashUm zum Beispiel deinen Apache-Webserver anzuwerfen, tippst du:
$ sudo systemctl start apache2bashMöchtest du einen aktiven Dienst beenden, hilft dir stop weiter:
$ sudo systemctl stop application.servicebashNeustart und Konfiguration laden
Nach einer Änderung an der Konfiguration ist oft ein Neustart nötig. Dafür nutzt du restart:
$ sudo systemctl restart application.servicebashKann die Anwendung ihre Einstellungen ohne kompletten Neustart übernehmen? Dann ist reload die elegantere Wahl:
$ sudo systemctl reload application.servicebashBist du unsicher, ob der Dienst das Neuladen unterstützt? Nutze reload-or-restart. Dieser Befehl versucht zuerst die Konfiguration neu zu laden und führt nur dann einen Neustart durch, wenn es nicht anders geht.
$ sudo systemctl reload-or-restart application.servicebashAutostart festlegen
Du entscheidest, welche Dienste beim Booten direkt mitstarten sollen. Das spart Ressourcen und erhöht die Sicherheit. Um einen Dienst für den automatischen Start beim Systemhochlauf zu registrieren, verwende enable:
$ sudo systemctl enable application.servicebashDabei wird im Hintergrund ein symbolischer Link erstellt. Dieser verknüpft die Dienstdatei (meist in /lib/systemd/system) mit dem Autostart-Verzeichnis von systemd (oft unter /etc/systemd/system/some_target.target.wants).
$ sudo systemctl enable application.servicebashSoll ein Dienst nicht mehr automatisch starten, wähle disable:
$ sudo systemctl disable application.servicebashDamit wird der Link gelöscht. Wichtig: Das Aktivieren sorgt nur dafür, dass der Dienst beim nächsten Booten startet. Willst du ihn sofort und dauerhaft aktiv haben, musst du zusätzlich start ausführen.
Status von Diensten prüfen
systemctl liefert dir präzise Details zum Zustand deiner Dienste. Das ist ideal für das Monitoring oder die Fehlersuche. Nutze dafür status:
$ systemctl status application.servicebashDu erhältst Infos zum aktuellen Status (aktiv, fehlerhaft etc.), siehst die letzten Log-Einträge und die zugehörigen Prozesse.
Willst du nur kurz wissen, ob ein Dienst läuft? Dann reicht is-active:
$ systemctl is-active application.servicebashHier erhältst du als Antwort meist active oder inactive.
Ob ein Dienst für den Autostart vorgesehen ist, verrät dir is-enabled:
$ systemctl is-enabled application.servicebashZusätzlich kannst du mit is-failed prüfen, ob bei einem Dienst ein Fehler vorliegt:
$ systemctl is-failed application.servicebashEin active bedeutet alles okay, während failed auf Probleme hinweist. Ein Exit-Status von 0 bestätigt einen handfesten Fehler.
Den Überblick behalten
Neben dem Management einzelner Dienste hilft dir systemctl auch dabei, das gesamte System im Blick zu behalten.
list-units listet dir alle aktiven Units auf:
$ systemctl list-unitsbashDie Liste zeigt dir verschiedene Spalten:
- UNIT: Der Name der Einheit (z. B. sshd.service).
- LOAD: Wurde die Datei geladen? (
loaded,not-foundodererror). - ACTIVE: Der Status (z. B.
activeoderinactive). - SUB: Genauere Details zum Zustand (z. B.
runningoderexited). - DESCRIPTION: Was macht diese Unit eigentlich?
Standardmäßig siehst du nur aktive Einheiten. Willst du wirklich alles sehen, was geladen wurde, nutze das Flag --all:
$ systemctl list-units --allbashMit --state= kannst du die Liste weiter filtern, zum Beispiel nach inaktiven Einheiten:
$ systemctl list-units --all --state=inactivebashOder du lässt dir mit --type= nur bestimmte Typen anzeigen:
$ systemctl list-units --type=servicebashAlle Unit-Dateien auflisten
Um alle verfügbaren Unit-Dateien zu sehen – auch die, die gar nicht geladen sind – nimmst du list-unit-files:
$ systemctl list-units-filesbashDabei triffst du auf verschiedene Zustände:
- Enabled: Startet automatisch beim Booten.
- Disabled: Kein automatischer Start.
- Masked: Komplett gesperrt (kann nicht gestartet werden).
- Static: Wird nur gestartet, wenn eine andere Unit sie braucht.
Einheiten im Detail verwalten
Manchmal musst du tiefer graben. systemctl bietet dir dafür die passenden Werkzeuge.
Unit-Datei einsehen
Willst du wissen, was genau in einer Unit-Datei steht? Mit cat gibst du den Inhalt direkt im Terminal aus:
$ systemctl cat ssh.servicebashAbhängigkeiten checken
Welche Dienste hängen voneinander ab? Das zeigt dir list-dependencies in einer übersichtlichen Baumstruktur:
$ systemctl list-dependencies sshd.servicebashMit --reverse siehst du umgekehrt, wer von deinem Dienst abhängig ist.
Einheiten maskieren
Wenn du sichergehen willst, dass ein Dienst unter keinen Umständen startet (weder manuell noch automatisch), musst du ihn maskieren. Das erzeugt einen Link zu /dev/null:
$ sudo systemctl mask nginx.servicebashUm die Sperre wieder aufzuheben, nutzt du unmask:
$ sudo systemctl unmask nginx.servicebashUnit-Dateien anpassen
Du kannst Unit-Dateien direkt bearbeiten. Mit edit öffnet sich der passende Editor:
$ sudo systemctl edit nginx.servicebashDabei wird oft nur ein „Snippet“ erstellt, das Vorrang vor der Originaldatei hat. Willst du die komplette Datei ändern, nutze das Flag --full:
$ sudo systemctl edit --full nginx.servicebashUm deine Anpassungen rückgängig zu machen, lösche einfach das entsprechende Verzeichnis oder die Datei in /etc/systemd/system:
$ sudo rm -r /etc/systemd/system/nginx.service.dbashVergiss danach nicht, systemd neu zu laden:
$ sudo systemctl daemon-reloadbashSystemzustände (Ziele) steuern
Ziele (Targets) gruppieren Units, um bestimmte Zustände zu erreichen – vergleichbar mit den alten Runleveln. Sie dienen als Meilensteine für dein System.
Standardziel verwalten
Welcher Zustand soll beim Booten standardmäßig erreicht werden? So findest du es heraus:
$ systemctl get-default
Output
multi-user.targetbashMöchtest du zum Beispiel standardmäßig in die grafische Oberfläche booten, setze das Ziel mit set-default:
$ sudo systemctl set-default graphical.targetbashZiele isolieren
Mit isolate wechselst du den Modus sofort: Alle Units des Ziels starten, alle anderen stoppen.
Willst du von der Grafikoberfläche in den reinen Textmodus für mehrere Nutzende wechseln? Isoliere das multi-user.target:
$ systemctl list-dependencies multi-user.targetbashDann führst du den Wechsel durch:
$ sudo systemctl isolate multi-user.targetbashSchnellbefehle für wichtige Aktionen
Für die gängigsten Aufgaben gibt es praktische Shortcuts:
Rettungsmodus starten:
$ sudo systemctl rescuebashSystem anhalten:
$ sudo systemctl haltbashServer komplett herunterfahren:
$ sudo systemctl poweroffbashNeustart einleiten:
$ sudo systemctl rebootbashDiese Shortcuts haben den Vorteil, dass sie alle angemeldeten Personen über den Vorgang informieren – ein sauberer Weg für jede Administration.