systemctl: Systemd-Dienste und Einheiten Verwalten

Unter Linux spielt systemctl eine zentrale Rolle bei der Verwaltung des Init-Systems und Service-Managers systemd. Mit systemctl haben Benutzende die Kontrolle über systemd-Dienste, -Einheiten und -Konfigurationen, was es zu einem unverzichtbaren Werkzeug für die Systemadministration macht. Von der Startkontrolle bis zur Anpassung von Systemzuständen bietet systemctl eine umfassende Palette an Funktionen.

Was ist systemctl?

systemctl ist ein Kommandozeilenwerkzeug zur Verwaltung von systemd, einem Init-System und Systemmanager für Linux-Betriebssysteme. systemd ist mittlerweile das Standard-Init-System bei vielen Linux-Distributionen bzw. Linux-Server-Distributionen wie Ubuntu, Debian, Fedora, Red Hat Enterprise Linux (RHEL), CentOS, Arch Linux, Mageia oder Gentoo, jedoch nicht durchgängig in allen Distributionen implementiert.

Im systemd-Ökosystem spielt systemctl eine zentrale Rolle bei der Verwaltung von Systemdiensten, Konfiguration, Startverhalten und Systemwartung. Die Funktionalität des Tools geht dabei über das einfache Starten und Beenden von Diensten hinaus und bietet eine umfassende Kontrolle über nahezu alle Aspekte eines Linux-Systems.

Im nachfolgenden Tutorial finden Sie praktische Codebeispiele und Linux-Befehle zur Verwendung von systemctl auf Basis von Ubuntu 22.04.

Verwaltung von Diensten

Das primäre Ziel des Init-Systems ist es, die Komponenten zu starten, die nach dem Booten des Linux-Kernels Linux-Kernels benötigt werden („userland“-Komponenten). Darüber hinaus dient das Init-System dazu, Dienste und Daemons auf einem Server zu jedem Zeitpunkt des Systemlaufs effektiv zu steuern.

Innerhalb von systemd konzentrieren sich die meisten Prozesse auf sogenannte Units, also Ressourcen, die von systemd verwaltet werden. Diese Units werden nach dem Typ der Ressource, die sie repräsentieren, klassifiziert und durch die sogenannten Unit-Dateien definiert. Der Typ einer Unit ist an der Dateiendung erkennbar.

Bei der Verwaltung von Diensten stehen speziell die Dienst-Units im Vordergrund, die mit dem Suffix .service enden. Häufig ist es bei Dienstverwaltungsbefehlen jedoch nicht nötig, dieses Suffix anzugeben, da systemd in der Lage ist zu erkennen, dass mit diesen Befehlen in der Regel Dienste gemeint sind.

Starten und Anhalten von Diensten

Zu den häufigsten Aufgaben, die unter Linux mit systemctl durchgeführt werden, gehören das Starten und Anhalten von Diensten. Diese Funktionen sind grundlegend für die Systemverwaltung und ermöglichen es, die Kontrolle über die auf einem System laufenden Prozesse zu behalten. Um einen Dienst zu starten, verwenden Sie den Befehl start. Wenn Sie als Benutzerin bzw. Benutzer ohne Root-Rechte arbeiten, müssen Sie dabei sudo verwenden:

$ sudo systemctl start application.service
bash

Da systemd darauf ausgelegt ist, automatisch nach .service-Dateien für Dienstverwaltungsbefehle zu suchen, kann der Befehl auch vereinfacht eingegeben werden:

$ sudo systemctl start application
bash

Um beispielsweise den Apache-Webserver zu starten, würden Sie eingeben:

$ sudo systemctl start apache2
bash

Wenn Sie einen laufenden Dienst anhalten möchten, verwenden Sie stop:

$ sudo systemctl stop application.service
bash

vServer (VPS) von IONOS

Günstige und starke VPS für Webserver, Mailserver und eigene Anwendungen mit persönlichem Berater und 24/7 Support!

100 % SSD-Speicher
Bereit in 55 Sek.
SSL Zertifikat

Neustart und Neuladen

Um einen Dienst neu zu starten, was oft nach einer Konfigurationsänderung erforderlich ist, verwenden Sie den Befehl restart:

$ sudo systemctl restart application.service
bash

Wenn die entsprechende Anwendung in der Lage ist, ihre Konfigurationsdateien ohne Neustart neu zu laden, kann der Befehl reload verwendet werden, um diesen Vorgang zu initiieren:

$ sudo systemctl reload application.service
bash

Wenn Sie unsicher sind, ob ein Dienst die Möglichkeit bietet, seine Konfiguration neu zu laden, können Sie den Befehl reload-or-restart verwenden. Dieser lädt die Konfiguration erneut, falls diese Option unterstützt wird. Sollte das nicht möglich sein, führt der Befehl stattdessen einen Neustart des Dienstes durch, um die aktualisierte Konfiguration zu übernehmen.

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

Aktivieren und Deaktivieren von Diensten

Durch das Aktivieren und Deaktivieren von Diensten können Sie festlegen, ob ein Dienst beim Booten des Systems automatisch gestartet werden soll oder nicht. Dies spielt insbesondere für die Systemleistung, die Sicherheit und das Management von Abhängigkeiten zwischen verschiedenen Diensten eine zentrale Rolle. Um einen Dienst so zu konfigurieren, dass er beim Systemstart automatisch ausgeführt wird, verwenden Sie den Befehl enable:

$ sudo systemctl enable application.service
bash

Indem dieser Prozess ausgeführt wird, entsteht ein symbolischer Link. Dieser Link verbindet die Kopie der Systemdienstdatei, die üblicherweise unter /lib/systemd/system oder /etc/systemd/system zu finden ist, mit dem Verzeichnis auf der Festplatte, in dem systemd nach Dateien für den Autostart sucht, was in der Regel unter /etc/systemd/system/some_target.target.wants geschieht.

$ sudo systemctl enable application.service
bash

Um zu verhindern, dass ein Dienst beim Booten automatisch startet, verwenden Sie disable:

$ sudo systemctl disable application.service
bash

Hierdurch wird der symbolische Link gelöscht, der zuvor festlegte, dass der Dienst automatisch starten soll. Achtung: Das bloße Aktivieren eines Dienstes startet diesen nicht sofort in der aktuellen Sitzung. Um den Dienst sofort zu starten und für den automatischen Start beim Hochfahren zu konfigurieren, müssen Sie sowohl den start- als auch den enable-Befehl ausführen.

Überprüfen des Status von Diensten

Mit systemctl lassen sich detaillierte Informationen über den Status von Diensten anzeigen. Diese Funktion ist besonders nützlich, um den aktuellen Zustand von System- und Anwendungsdiensten zu überwachen und zu diagnostizieren. Für die Überprüfung verwenden Sie den Befehl status:

$ systemctl status application.service
bash

Dieser Befehl liefert eine Vielzahl von Informationen, darunter den aktuellen Zustand des Dienstes (aktiv, inaktiv, fehlerhaft etc.), die zuletzt ausgeführten Prozesse und Logmeldungen, die cgroup-Hierarchie und die ersten Protokollzeilen.

Um den aktuellen Aktivitätsstatus eines Dienstes unter Linux mit systemctl zu überprüfen, wird is-active verwendet. Dieser Befehl gibt an, ob ein Dienst aktuell aktiv ist oder nicht:

$ systemctl is-active application.service
bash

Der aktuelle Zustand wird dabei in der Regel mit active angegeben, wenn der Dienst aktiv ist, oder inactive, wenn der Dienst inaktiv ist.

Um zu überprüfen, ob ein Dienst so konfiguriert ist, dass er beim Systemstart automatisch aktiviert wird, können Sie den Befehl is-enabled nutzen. Dies ist besonders nützlich, um die Startkonfiguration von Diensten auf einem Linux-System zu verwalten.

$ systemctl is-enabled application.service
bash

Der Command zeigt an, ob der Dienst aktiviert oder deaktiviert ist und legt dementsprechend den Exit-Code auf „0“ oder „1“ fest, basierend auf der Rückmeldung.

Mit dem Befehl is-failed können Sie zudem überprüfen, ob ein bestimmter Dienst einen Fehlerstatus aufweist:

$ systemctl is-failed application.service
bash

Bei erfolgreicher Ausführung wird active ausgegeben, falls ein Fehler vorliegt failed. Wenn die Einheit absichtlich gestoppt wurde, kann unknown oder inactive als Antwort erscheinen. Ein Exit-Status 0 signalisiert das Auftreten eines Fehlers, während 1 auf jeden anderen Zustand hinweist.

Übersicht über den Systemstatus

Die bisher vorgestellten Befehle konzentrierten sich auf das Management einzelner Dienste, aber sie bieten keinen umfassenden Einblick in den gegenwärtigen Systemzustand. Es existiert jedoch eine Vielzahl an systemctl-Commands, die genau diese Art von Informationen liefern.

list-units ist ein nützliches Werkzeug, um sich einen Überblick über die aktuellen Units auf Linux zu verschaffen:

$ systemctl list-units
bash

Wenn Sie den Befehl ausführen, zeigt systemctl eine Liste von Units an, die systemd verwaltet. Die Ausgabe dieser Liste beinhaltet verschiedene Spalten mit spezifischen Informationen über jede Unit. Diese Spalten werden Ihnen angezeigt:

  • UNIT: Der Name der Einheit, oft der Dateiname der entsprechenden Unit-Datei, z. B. sshd.service für den SSH-Daemon
  • LOAD: Zeigt an, ob die Unit-Datei erfolgreich geladen wurde; mögliche Werte sind loaded, not-found oder error.
  • ACTIVE: Der Aktivitätsstatus der Einheit; dieser kann Werte wie active, inactive, activating oder deactivating annehmen.
  • SUB: Der untergeordnete Aktivitätsstatus, der weitere Details zum Zustand der Einheit gibt; z. B. könnte eine active-Einheit einen SUB-Status von running, exited oder failed haben.
  • DESCRIPTION: Eine kurze Beschreibung der Einheit, die oft den Zweck oder die Funktionalität der Einheit wiedergibt

Allerdings zeigt der Befehl standardmäßig nur aktive Einheiten an, weshalb in der Ausgabe die Spalte LOAD typischerweise loaded und die Spalte ACTIVE active anzeigt. Mit zusätzlichen Flags lässt sich systemctl so konfigurieren, dass es auch erweiterte Informationen anzeigt. Um z. B. alle von systemd geladenen Einheiten unabhängig von ihrem aktuellen Aktivitätsstatus anzuzeigen, nutzen Sie das Flag --all:

$ systemctl list-units --all
bash

Die Ausgabe kann weiter verfeinert werden, indem Sie zusätzliche Flags wie --state= verwenden, um spezifische Zustände in den Kategorien LOAD, ACTIVE oder SUB zu filtern. Wichtig ist dabei, das --all-Flag beizubehalten, damit auch inaktive Einheiten angezeigt werden:

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

Mit dem Filter --type= können Sie sich zusätzlich nur bestimmte Arten von Einheiten anzeigen lassen, um z. B. ausschließlich aktive Dienst-Einheiten zu sehen:

$ systemctl list-units --type=service
bash

Auflisten aller Unit-Dateien

Um eine Liste aller Unit-Dateien auf Linux mit systemctl anzuzeigen – inklusive derjenigen, die systemd nicht versucht hat zu laden –, können Sie list-unit-files verwenden. Dieser Befehl zeigt alle Unit-Dateien an, die systemd bekannt sind, einschließlich Diensten, Sockets, Targets und mehr.

$ systemctl list-units-files
bash

Der Command zeigt verschiedene Zustände von Unit-Dateien an. Diese Zustände geben an, wie die jeweiligen Units konfiguriert sind, insbesondere in Bezug auf ihr Verhalten beim Systemstart. Die häufigsten Zustände sind:

  • Enabled: Die Unit ist so konfiguriert, dass sie automatisch beim Systemstart aktiviert wird.
  • Disabled: Die Unit ist nicht für den automatischen Start beim Bootvorgang konfiguriert.
  • Masked: Die Unit ist vollständig deaktiviert, sodass sie nicht manuell oder automatisch gestartet werden kann.
  • Static: Die Unit wird nicht eigenständig gestartet, sondern hängt typischerweise von einer anderen Unit ab und wird nur in diesem Kontext gestartet.

Verwaltung von Einheiten

Die Verwaltung von Einheiten ist eine der Hauptaufgaben von systemctl. Um spezifischere Informationen über einzelne Einheiten zu erhalten und diese zu verwalten, bietet systemctl eine Reihe von nützlichen Befehlen und Optionen.

Anzeigen einer Unit-Datei

Mit dem Befehl cat können Sie sich den Inhalt einer bestimmten Unit-Datei direkt in der Konsole anzeigen lassen. Um z. B. die Unit-Datei eines Dienstes wie ssh.service anzusehen, geben Sie ein:

$ systemctl cat ssh.service
bash

Anzeigen von Abhängigkeiten

Abhängigkeiten einer bestimmten Einheit lassen sich durch list-dependencies als Baumstruktur anzeigen. Der Befehl sieht wie folgt aus:

$ systemctl list-dependencies sshd.service
bash

Standardmäßig werden die Abhängigkeiten für .target-Einheiten angezeigt, die verschiedene Systemzustände repräsentieren. Für eine vollständige, rekursive Auflistung aller Abhängigkeiten nutzen Sie das Flag --all.

Zur Darstellung umgekehrter Abhängigkeiten, also Einheiten, die von der spezifizierten abhängen, fügen Sie --reverse zum Befehl hinzu. Zusätzlich ermöglichen die Flags --before und --after, die Abhängigkeiten zu sehen, die vor bzw. nach der betreffenden Einheit starten.

Maskieren und Demaskieren von Einheiten

Durch das Maskieren einer Einheit wird diese effektiv deaktiviert, sodass sie weder manuell noch automatisch gestartet werden kann. Dies wird oft verwendet, um sicherzustellen, dass ein Dienst oder eine Einheit nicht versehentlich oder automatisch durch Abhängigkeiten gestartet wird. Das Maskieren erfolgt durch Erstellen eines symbolischen Links der betreffenden Unit-Datei zu /dev/null mit dem Befehl mask:

$ sudo systemctl mask nginx.service
bash

Dadurch wird sichergestellt, dass der Nginx-Service, solange er im Maskierungsmodus ist, weder manuell noch automatisch gestartet werden kann.

Demaskieren hebt den Maskierungszustand einer Einheit auf, sodass diese wieder normal gestartet werden kann. Der Befehl zum Demaskieren lautet unmask:

$ sudo systemctl unmask nginx.service
bash

Bearbeiten von Unit-Dateien

systemctl verfügt über Optionen, um Unit-Dateien anzupassen und zu modifizieren. Diese Fähigkeit wurde mit der Version 218 von systemd eingeführt. Wenn Sie den Befehl edit nutzen, wird automatisch eine Unit-Datei der gewählten Einheit zur Bearbeitung geöffnet:

$ sudo systemctl edit nginx.service
bash

Bei der Bearbeitung wird eine leere Datei erstellt, um spezifische Anweisungen zu einer Unit-Definition hinzuzufügen oder zu ändern. Für jede Einheit, z.B. nginx.service, wird im Verzeichnis /etc/systemd/system ein Unterordner angelegt, der den Namen der Datei mit angehängtem .d trägt – in diesem Fall also nginx.service.d.

In diesem Unterordner wird die Datei override.conf erzeugt. Wenn systemd die Einheit lädt, kombiniert es den Inhalt dieser Snippet-Datei mit der originalen Unit-Datei, wobei die Anweisungen des Snippets Priorität haben. Um die gesamte Unit-Datei zu bearbeiten, kann das Flag --full verwendet werden:

$ sudo systemctl edit --full nginx.service
bash

Durch --full wird die bestehende Unit-Datei in einem Editor geöffnet, um Modifikationen vorzunehmen. Beim Verlassen des Editors speichert das System die bearbeitete Datei in /etc/systemd/system.

Um selbst vorgenommene Änderungen rückgängig zu machen, können Sie entweder das Konfigurationsverzeichnis .d der Einheit oder die modifizierte Datei in /etc/systemd/system löschen:

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

Eine komplett überarbeitete Unit-Datei wird mit folgendem Befehl gelöscht:

$ sudo rm /etc/systemd/system/nginx.service
bash

Nach dem Entfernen der Datei oder des Verzeichnisses ist es notwendig, systemd neu zu laden, damit es aufhört, auf die gelöschten Dateien zu verweisen und stattdessen wieder auf die systemeigene Kopie zurückgreift:

$ sudo systemctl daemon-reload
bash

Anpassen des Systemzustands (Runlevel) mit Zielen

Ziele dienen in systemd primär dazu, verschiedene Einheiten zu gruppieren, um spezifische Systemzustände zu realisieren – ähnlich wie Runlevel in anderen Init-Systemen. Die Dateien mit dem Suffix .target fungieren als Orientierungspunkte, die den Verfügbarkeitsstatus bestimmter Funktionen anzeigen, sodass Nutzende den gewünschten Gesamtzustand anstatt der einzelnen nötigen Einheiten spezifizieren können.

Ein praktisches Beispiel ist das swap.target, das den Zustand der Swap-Bereitschaft markiert. Einheiten, die am Swap-Prozess beteiligt sind, können sich mittels Konfigurationsoptionen wie WantedBy= oder RequiredBy= auf dieses Ziel abstimmen. Einheiten hingegen, die auf Swap angewiesen sind, können dies durch Einstellungen wie Wants=, Requires= und After= kennzeichnen, um ihre Abhängigkeit und Startreihenfolge im Verhältnis zum Swap auszudrücken.

Abrufen und Einrichten des Standardziels

Das Abrufen und Einrichten des Standardziels ermöglicht es, einen Standard-Systemzustand zu bestimmen, den Ihr System beim Start erreichen soll. So finden Sie das Standardziel für Ihr System:

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

Wenn Sie das Standardziel ändern möchten, verwenden Sie den Command set-default zusammen mit dem Namen des Ziels. Mit folgendem Befehl setzen Sie das Standardziel auf graphical.target, wodurch eine grafische Benutzeroberfläche startet:

$ sudo systemctl set-default graphical.target
bash

Auflisten verfügbarer Ziele

Um alle auf Ihrem System verfügbaren Ziele aufzulisten, können Sie folgenden Befehl verwenden:

$ systemctl list-unit-files --type=target
bash

Dies zeigt eine Liste aller auf Ihrem System installierten Ziel-Unit-Dateien an. Für jedes Ziel werden der Pfad und der aktuelle Status (z. B. aktiviert oder deaktiviert) angezeigt.

Isolieren von Zielen

Mit isolate lassen sich alle Einheiten aktivieren, die mit einem bestimmten Ziel verbunden sind, und gleichzeitig alle anderen, nicht damit verbundenen Einheiten stoppen.

Nehmen wir an, Sie arbeiten in einer Umgebung mit dem aktiven graphical.target und möchten auf einen reinen Multi-User-Modus ohne grafische Oberfläche wechseln. In diesem Fall können Sie durch Isolieren des multi-user.target das grafische System deaktivieren. Da das graphical.target von multi-user.target abhängig ist, aber nicht umgekehrt, werden beim Wechsel alle grafischen Services gestoppt.

Allerdings sollten Sie vor dem Isolieren eines Ziels die damit verbundenen Abhängigkeiten überprüfen. So vermeiden Sie das ungewollte Anhalten wichtiger Prozesse.

$ systemctl list-dependencies multi-user.target
bash

Falls Sie die aktiven Einheiten, die Sie beibehalten möchten, überprüft haben und damit einverstanden sind, können Sie das gewünschte Ziel isolieren:

$ sudo systemctl isolate multi-user.target
bash

Verwenden von Shortcuts für wichtige Ereignisse

Es gibt spezifische Ziele für wesentliche Vorgänge wie das Herunterfahren oder Neustarten des Systems. Unter Linux bietet systemctl jedoch auch praktische Abkürzungen, die zusätzliche Funktionen bereitstellen. Um z. B. das System in den Rettungsmodus (Single-User-Modus) zu versetzen, können Sie einfach rescue anstelle von isolate rescue.target verwenden:

$ sudo systemctl rescue
bash

Mit halt können Sie das System anhalten:

$ sudo systemctl halt
bash

Ein vollständiges Herunterfahren können Sie mit poweroff einleiten:

$ sudo systemctl poweroff
bash

Mit reboot leiten Sie dagegen einen Neustart ein:

$ sudo systemctl reboot
bash

Diese Befehle informieren eingeloggte Nutzerinnen und Nutzer über bevorstehende Ereignisse, was durch reines Ausführen oder Isolieren des Ziels nicht erreicht wird. Es ist wichtig zu wissen, dass viele Rechner die kürzeren Befehle für diese Aktionen mit systemd verknüpfen, um eine korrekte Ausführung zu gewährleisten.

Für einen Systemneustart etwa ist normalerweise der folgende Befehl ausreichend:

$ sudo reboot
bash