Unter Linux nimmt systemctl eine Schlüs­sel­rol­le 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 Kon­fi­gu­ra­tio­nen – ein un­ver­zicht­ba­res Tool für die pro­fes­sio­nel­le Sys­tem­ad­mi­nis­tra­ti­on. Von der Start­steue­rung bis zum Fein­tu­ning von Sys­tem­zu­stän­den bietet dir systemctl alles, was du brauchst.

Was ist systemctl?

systemctl ist dein Kom­man­do­zei­len-Werkzeug, um systemd zu verwalten – das Herzstück vieler Linux-Be­triebs­sys­te­me. systemd ist mitt­ler­wei­le der Standard bei populären Linux-Dis­tri­bu­tio­nen bzw. Server-Be­triebs­sys­te­men wie Ubuntu, Debian, Fedora, RHEL, CentOS oder Arch Linux.

Innerhalb von systemd ist systemctl für die Ver­wal­tung von Sys­tem­diens­ten, Kon­fi­gu­ra­tio­nen, das Start­ver­hal­ten und die Wartung zuständig. Dabei geht der Funk­ti­ons­um­fang weit über das bloße Starten von Pro­gram­men hinaus: Du steuerst damit fast jeden Aspekt deines Linux-Servers.

In diesem Guide zeigen wir dir prak­ti­sche Code­bei­spie­le und Linux-Befehle für systemctl, basierend auf Ubuntu 22.04.

Dienste effizient verwalten

Die Haupt­auf­ga­be des Init-Systems ist es, alle Kom­po­nen­ten zu laden, die nach dem Booten des Linux-Kernels benötigt werden (die so­ge­nann­ten „Userland“-Kom­po­nen­ten). Zudem steuerst du damit Dienste und Daemons während des laufenden Betriebs.

In systemd dreht sich alles um Units. Das sind Res­sour­cen, die vom System verwaltet werden. Jede Unit hat einen Typ (z. B. Dienst, Mount-Punkt), den du an der Da­tei­endung 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 au­to­ma­tisch erkennt, dass du einen Dienst meinst.

Dienste starten und stoppen

Das Ein- und Aus­schal­ten von Diensten gehört zum Ad­mi­nis­tra­tor-Alltag. So behältst du die volle Kontrolle über alle Prozesse. Um einen Dienst zu ak­ti­vie­ren, nutzt du start. Falls du nicht als Root ein­ge­loggt bist, setze einfach sudo davor:

$ sudo systemctl start application.service
bash

Da systemd schlau genug ist, nach .service-Dateien zu suchen, reicht auch die Kurzform:

$ sudo systemctl start application
bash

Um zum Beispiel deinen Apache-Webserver an­zu­wer­fen, tippst du:

$ sudo systemctl start apache2
bash

Möchtest du einen aktiven Dienst beenden, hilft dir stop weiter:

$ sudo systemctl stop application.service
bash

Neustart und Kon­fi­gu­ra­ti­on laden

Nach einer Änderung an der Kon­fi­gu­ra­ti­on ist oft ein Neustart nötig. Dafür nutzt du restart:

$ sudo systemctl restart application.service
bash

Kann die Anwendung ihre Ein­stel­lun­gen ohne kom­plet­ten Neustart über­neh­men? Dann ist reload die ele­gan­te­re Wahl:

$ sudo systemctl reload application.service
bash

Bist du unsicher, ob der Dienst das Neuladen un­ter­stützt? Nutze reload-or-restart. Dieser Befehl versucht zuerst die Kon­fi­gu­ra­ti­on neu zu laden und führt nur dann einen Neustart durch, wenn es nicht anders geht.

$ sudo systemctl reload-or-restart application.service
bash

Autostart festlegen

Du ent­schei­dest, welche Dienste beim Booten direkt mit­star­ten sollen. Das spart Res­sour­cen und erhöht die Si­cher­heit. Um einen Dienst für den au­to­ma­ti­schen Start beim Sys­tem­hoch­lauf zu re­gis­trie­ren, verwende enable:

$ sudo systemctl enable application.service
bash

Dabei wird im Hin­ter­grund ein sym­bo­li­scher Link erstellt. Dieser verknüpft die Dienst­da­tei (meist in /lib/systemd/system) mit dem Autostart-Ver­zeich­nis von systemd (oft unter /etc/systemd/system/some_target.target.wants).

$ sudo systemctl enable application.service
bash

Soll ein Dienst nicht mehr au­to­ma­tisch starten, wähle disable:

$ sudo systemctl disable application.service
bash

Damit wird der Link gelöscht. Wichtig: Das Ak­ti­vie­ren sorgt nur dafür, dass der Dienst beim nächsten Booten startet. Willst du ihn sofort und dauerhaft aktiv haben, musst du zu­sätz­lich start ausführen.

Status von Diensten prüfen

systemctl liefert dir präzise Details zum Zustand deiner Dienste. Das ist ideal für das Mo­ni­to­ring oder die Feh­ler­su­che. Nutze dafür status:

$ systemctl status application.service
bash

Du erhältst Infos zum aktuellen Status (aktiv, feh­ler­haft etc.), siehst die letzten Log-Einträge und die zu­ge­hö­ri­gen Prozesse.

Willst du nur kurz wissen, ob ein Dienst läuft? Dann reicht is-active:

$ systemctl is-active application.service
bash

Hier erhältst du als Antwort meist active oder inactive.

Ob ein Dienst für den Autostart vor­ge­se­hen ist, verrät dir is-enabled:

$ systemctl is-enabled application.service
bash

Zu­sätz­lich kannst du mit is-failed prüfen, ob bei einem Dienst ein Fehler vorliegt:

$ systemctl is-failed application.service
bash

Ein active bedeutet alles okay, während failed auf Probleme hinweist. Ein Exit-Status von 0 bestätigt einen hand­fes­ten Fehler.

Den Überblick behalten

Neben dem Ma­nage­ment einzelner Dienste hilft dir systemctl auch dabei, das gesamte System im Blick zu behalten.

list-units listet dir alle aktiven Units auf:

$ systemctl list-units
bash

Die Liste zeigt dir ver­schie­de­ne Spalten:

  • UNIT: Der Name der Einheit (z. B. sshd.service).
  • LOAD: Wurde die Datei geladen? (loaded, not-found oder error).
  • ACTIVE: Der Status (z. B. active oder inactive).
  • SUB: Genauere Details zum Zustand (z. B. running oder exited).
  • DE­SCRIP­TI­ON: Was macht diese Unit ei­gent­lich?

Stan­dard­mä­ßig siehst du nur aktive Einheiten. Willst du wirklich alles sehen, was geladen wurde, nutze das Flag --all:

$ systemctl list-units --all
bash

Mit --state= kannst du die Liste weiter filtern, zum Beispiel nach inaktiven Einheiten:

$ systemctl list-units --all --state=inactive
bash

Oder du lässt dir mit --type= nur bestimmte Typen anzeigen:

$ systemctl list-units --type=service
bash

Alle Unit-Dateien auflisten

Um alle ver­füg­ba­ren Unit-Dateien zu sehen – auch die, die gar nicht geladen sind – nimmst du list-unit-files:

$ systemctl list-units-files
bash

Dabei triffst du auf ver­schie­de­ne Zustände:

  • Enabled: Startet au­to­ma­tisch beim Booten.
  • Disabled: Kein au­to­ma­ti­scher 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.service
bash

Ab­hän­gig­kei­ten checken

Welche Dienste hängen von­ein­an­der ab? Das zeigt dir list-dependencies in einer über­sicht­li­chen Baum­struk­tur:

$ systemctl list-dependencies sshd.service
bash

Mit --reverse siehst du umgekehrt, wer von deinem Dienst abhängig ist.

Einheiten maskieren

Wenn du si­cher­ge­hen willst, dass ein Dienst unter keinen Umständen startet (weder manuell noch au­to­ma­tisch), musst du ihn maskieren. Das erzeugt einen Link zu /dev/null:

$ sudo systemctl mask nginx.service
bash

Um die Sperre wieder auf­zu­he­ben, nutzt du unmask:

$ sudo systemctl unmask nginx.service
bash

Unit-Dateien anpassen

Du kannst Unit-Dateien direkt be­ar­bei­ten. Mit edit öffnet sich der passende Editor:

$ sudo systemctl edit nginx.service
bash

Dabei wird oft nur ein „Snippet“ erstellt, das Vorrang vor der Ori­gi­nal­da­tei hat. Willst du die komplette Datei ändern, nutze das Flag --full:

$ sudo systemctl edit --full nginx.service
bash

Um deine An­pas­sun­gen rück­gän­gig zu machen, lösche einfach das ent­spre­chen­de Ver­zeich­nis oder die Datei in /etc/systemd/system:

$ sudo rm -r /etc/systemd/system/nginx.service.d
bash

Vergiss danach nicht, systemd neu zu laden:

$ sudo systemctl daemon-reload
bash

Sys­tem­zu­stän­de (Ziele) steuern

Ziele (Targets) grup­pie­ren Units, um bestimmte Zustände zu erreichen – ver­gleich­bar mit den alten Runleveln. Sie dienen als Mei­len­stei­ne für dein System.

Stan­dard­ziel verwalten

Welcher Zustand soll beim Booten stan­dard­mä­ßig erreicht werden? So findest du es heraus:

$ systemctl get-default
Output
multi-user.target
bash

Möchtest du zum Beispiel stan­dard­mä­ßig in die grafische Ober­flä­che booten, setze das Ziel mit set-default:

$ sudo systemctl set-default graphical.target
bash

Ziele isolieren

Mit isolate wechselst du den Modus sofort: Alle Units des Ziels starten, alle anderen stoppen.

Willst du von der Gra­fik­ober­flä­che in den reinen Textmodus für mehrere Nutzende wechseln? Isoliere das multi-user.target:

$ systemctl list-dependencies multi-user.target
bash

Dann führst du den Wechsel durch:

$ sudo systemctl isolate multi-user.target
bash

Schnell­be­feh­le für wichtige Aktionen

Für die gän­gigs­ten Aufgaben gibt es prak­ti­sche Shortcuts:

Ret­tungs­mo­dus starten:

$ sudo systemctl rescue
bash

System anhalten:

$ sudo systemctl halt
bash

Server komplett her­un­ter­fah­ren:

$ sudo systemctl poweroff
bash

Neustart einleiten:

$ sudo systemctl reboot
bash

Diese Shortcuts haben den Vorteil, dass sie alle an­ge­mel­de­ten Personen über den Vorgang in­for­mie­ren – ein sauberer Weg für jede Ad­mi­nis­tra­ti­on.

Zum Hauptmenü