systemd/systemctl

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ Ein Terminal öffnen

  2. ⚓︎ Root-Rechte

Inhaltsverzeichnis
  1. Installation
  2. Benutzung
    1. Kommandos zum Steuern von Units
    2. Kommandos für Unit-Dateien
    3. Bearbeiten von Unit-Dateien
      1. Ergänzungen an bestehenden Unit-Dateie...
      2. Kopieren einer bestehenden Unit-Datei
      3. Neuanlegen einer Unit-Datei
    4. System-Kommandos
    5. Optionen
    6. daemon-reload
  3. Links

systemctl ist ein Kommandozeilenwerkzeug für systemd. Mit Hilfe von systemctl können Befehle an systemd gesendet werden, z.B. zum Steuern von Units, zum Abfragen des Status, zum Herunterfahren des Systems etc.

Installation

Da systemd ab Ubuntu 15.04 integraler Bestandteil des Systems ist (und dieses ohne systemd nicht lauffähig ist), sind alle benötigten Komponenten bereits installiert.

Benutzung

Die allgemeine Syntax von systemctl lautet[1]:

systemctl [OPTIONEN] [KOMMANDO] 

Der Aufruf von systemctl ohne Optionen und Kommandos listet einfach alle geladenen Units auf. In der Regel wird der Befehl aber in Kombination mit einem Kommando und ggf. einer Option aufgerufen.

Wenn mit systemctl nur eine Abfrage erfolgt und eine Liste etc. ausgegeben wird, sind keine Root-Rechte[2] für die Ausführung notwendig. Wenn mit systemctl der Status einer Unit etc. geändert wird (Starten, Stoppen etc.), dann sind dafür in der Regel Root-Rechte erforderlich.

systemctl kennt sehr viele Kommandos und Optionen, von denen im folgenden nur einige aufgeführt sind. Eine komplette Übersicht liefert der Befehl systemctl -h und eine Übersicht mit ausführlicherer Erklärung ist in der Manpage zu systemctl zu finden.

Wenn im folgenden vom "Pattern" die Rede ist, dann ist damit ein Suchmuster gemeint. Ein Beispiel: Das Pattern a* würde auf alle Units etc. zutreffen, die mit dem Buchstaben a anfangen. Bei den meisten Kommandos kann anstelle eines Unit-Namens auch ein Pattern angegeben werden.

Kommandos zum Steuern von Units

Mit Hilfe von systemctl können Units gestoppt, gestartet, etc werden.

Einige Kommandos sind:

Kommandos zum Steuern von Units
Kommando Erklärung
list-units Listet alles geladenen Units auf.
list-timers Listet alle geladenen Timer auf.
list-sockets Listet alle geladenen Sockets auf.
start UNITNAME Startet die Unit mit dem Namen UNITNAME.
stop UNITNAME Stoppt die Unit mit dem Namen UNITNAME.
restart UNITNAME Startet die Unit mit dem Namen UNITNAME neu. Wenn die Unit noch nicht läuft, wird sie gestartet.
reload UNITNAME Startet die Unit mit dem Namen UNITNAME neu und lädt dabei die (eventuell) vorhandenen Konfigurationsdateien. Falls die Unit nicht läuft, wird sie durch reload nicht gestartet!
status UNITNAME Zeigt den Status der Unit mit dem Namen UNITNAME an. Ausgegeben werden u.a. der Status, die PIDs der zugehörigen Prozesse, die zugehörige Unit-Datei etc.

Eine komplette Übersicht inklusive ausführlicher Erklärung ist in der Dokumentation auf Debian 🇩🇪 zu finden.

Kommandos für Unit-Dateien

Units bestehen aus ein oder mehreren Dateien. Damit diese als Unit automatisch (z.B. beim Systemstart) ausgeführt werden, muss die Unit-Datei erst aktiviert werden. Eine manueller Start über das oben genannten Kommando systemctl start UNIT ist auch für nicht-aktivierte Units möglich.

Kommandos für Unit-Dateien
Kommando Erklärung
list-unit-files Listet alle Unit-Dateien aus. Zur Eingrenzung des Ergebnisses kann ein Pattern angegeben werden.
cat UNITDATEI Listet die Unit-Datei UNITDATEI inklusive etwaig vorhandener Ergänzungsdateien (override.conf). Dabei wird jeder vorhanden Datei zu einer UNITDATEI ein Kommentar mit deren Dateinamen und -pfad vorangestellt.
enable UNITDATEI Aktiviert die Unit-Datei UNITDATEI. Danach kann die zugehörige Unit automatisch (z.B. beim Systemstart) gestartet werden.
disable UNITDATEI Deaktiviert die Unit-Datei UNITDATEI. Nach der Deaktivierung wird zugehörige Unit nicht mehr automatisch gestartet. Die Unit kann aber nach wie vor als Abhängigkeit von einer anderen Unit geladen werden werden.
is-enabled UNITDATEI Prüft, über die Unit-Datei UNITDATEI aktiviert ist.
mask UNITDATEI Verhindert, dass eine Unit geladen wird. Die Unit kann so auch nicht mehr als Abhängigkeit von einer andere Unit geladen werden.
unmask UNITDATEI Ermöglicht wieder, dass eine Unit Datei geladen wird.

Bis auf das Kommando list-unit-files können an alle Kommandos auch immer mehrere UNITDATEIEN übergeben werden.

Eine vollständige Übersicht inklusive Erklärung zu den Unit-Datei Kommandos ist in der Dokumentation auf Debian 🇩🇪 von systemctl zu finden.

Bearbeiten von Unit-Dateien

Mit dem Kommando edit bietet systemctl die Möglichkeit, bestehende Unit-Dateien zu bearbeiten. Der Vorteil gegenüber der manuellen Bearbeitung mittels Editor liegt zum einen darin, dass man sich um die Pfade der Unit-Dateien nicht kümmern muss.

Systemctl sucht nach der für die Bearbeitung angegebenen Unit-Datei in den systemd System-Standardpfaden bzw. Benutzer-Standardpfaden und legt die Ergänzungsdateien, die Kopien der original Unit-Dateien oder auch neue Unit-Dateien in den passenden systemd-Verzeichnissen ab.

Außerdem werden die vorgenommen Änderungen beim Speichern nach der Bearbeitung mittels systemctl edit auch gleich unmittelbar angewandt, was einem

sudo systemctl daemon-reload 

bzw. einem

systemctl --user daemon-reload 

entspricht.

systemtl edit kann mit den Optionen --user, --global und --system kombiniert werden.

Abhängig von einer dieser Optionen legt systemctl die Ergänzungsdateien, die kopierten Dateien oder die neuen Dateien in einem der folgenden Verzeichnisse ab:

Ablageorte für systemctl edit
Option Ablage-Verzeichnis
--system /etc/systemd/system
--global /etc/systemd/user
--user ~/.config/systemd/user

--system und --global erforden Root-Rechte und damit ein vorausführendes sudo. --user kann mit einfachen Benutzerrechten angewendet werden.

Zu den systemd-Verzeichnissen siehe auch systemd/Units (Abschnitt „systemweite-Units“) und systemd/User Units (Abschnitt „Speicherorte“).

Beim Bearbeiten und Neuanlegen einer Unit-Datei muss außerdem auf deren Struktur geachtet werden.

Ergänzungen an bestehenden Unit-Dateien vornehmen

Möchte man nur ein paar Kleinigkeiten an einer bestehenden Unit-Datei vornehmen, diese z.B. um einen eigenen Eintrag erweitern oder auch einen einzelnen bestehenden Wert überschreiben, so macht man dies am besten mittels

sudo systemctl edit UNITNAME 

Damit wird eine bestehende Unit-Datei modifiziert. Der Befehl legt im entsprechende Ablage-Verzeichnis (s.o.) ein Unterverzeichnis UNITNAME.d/ und darin eine Datei override.conf an und bietet diese zur Bearbeitung an. Man notiert in dieser Datei nur die Unterschiede zur bestehenden Datei. Bei der späteren Anwendung der Unit wird systemd die ursprüngliche Datei mit der Datei override.conf zusammenführen. Wie der Name override.conf (engl. to override = deutsch überschreiben) schon aussagt, überschreiben dabei die Angaben aus der override.conf etwaige gleichlautende Option der original Unit-Datei.

Ab Ubuntu 22.04 blendet systemctl edit den Inhalt der original Unit-Datei während der Bearbeitung Hilfsweise wie folgt ein:

### Editing /etc/systemd/system/ntp.service.d/override.conf
### Anything between here and the comment below will become the new contents of>

...

### Lines below this comment will be discarded
<Es folgt der original Inhalt der Unit-Datei>

Die Änderungen sind hier in den markierten Bereich einzustellen!

Kopieren einer bestehenden Unit-Datei

Um die ganze Unit-Datei zu bearbeiten dient die Option --full.

sudo systemctl edit --full UNITNAME 

Dabei wird eine Kopie der original Unit-Datei im entsprechenden Verzeichnis (s.o.) erzeugt und diese zu Bearbeitung angeboten. Man muss eine vollständige Unit beschreiben. Bei der späteren Anwendung der Unit wird systemd die ursprüngliche Datei ignorieren und die hier überarbeitete Version verwenden.

Neuanlegen einer Unit-Datei

Möchte man eine vollständig neue Unit-Datei anlegen, die auf dem System noch nicht existiert so verwedet man dafür

sudo systemctl edit --full --force UNITNAME 

Die neue Unit-Datei wird in diesem Fall ebenfalls im entsprechenden Ablage-Verzeichnis (s.o.) angelegt.

Hinweis:

Wenn man den Editor mit einem leeren Fenster verlässt, wird die Bearbeitung in allen drei Fällen abgebrochen und die ursprüngliche Unit bleibt unverändert bzw. die neu Unit-Datei wird nicht angelegt.

System-Kommandos

Mit Hilfe von systemctl lässt sich der Zustand des Systems ändern:

System Kommandos
Kommando Erklärung
poweroff Fährt den Rechner herunter und schaltet ihn aus.
reboot Startet den Rechner neu.
suspend Versetzt den Rechner in Bereitschaft.
hibernate Versetzt den Rechner in den Ruhezustand.

Die Kommandos poweroff, reboot und suspend können mit normalen Benutzerechten ausgeführt werden und eignen sich dadurch z.B. auch zum Einsatz in Skripten und Startern, welche ohne Root-Rechte laufen. Sie werden ohne weitere Rückfrage ausgeführt. Bei poweroff und reboot können bei offenen Dateien Datenverluste auftreten; Benutzer sollten vor diesen Befehlen ihre Dateien explizit selber schließen.

Dagegen erfordert hibernate root-Rechte. Ob auf dem eigenen System Hibernate (Suspend to Disk) überhaupt funktioniert und richtig konfiguriert ist, kümmert systemd allerdings überhaupt nicht. Man sollte damit rechnen, dass bei diesem Befehl sich der eigene Rechner nicht wie erwartet verhält und insbesondere z.B. nach dem Aufwecken tatsächlich ein Neustart erfolgt.

systemctl kennt noch eine Reihe weiterer Systemkommandos. Eine vollständige Übersicht inklusive Erklärung ist in der Dokumentation 🇩🇪 von systemctl zu finden.

Optionen

Im folgenden werden einige Optionen von systemctl aufgeführt:

Optionen systemctl
Option Erklärung
--all Es werden alle Units/Dateien aufgelistet, nicht nur die aktiven (was die Voreinstellung ist)
t TYP, --type=TYP Listet nur Units vom Typ TYP auf. Mögliche Typen sind z.B. service, timer, mount oder socket.
--state=STATUS Zeigt nur Units mit dem Status STATUS an. Mögliche Status sind: LOAD, SUB, ACTIVE und failed
-H BENUTZER@RECHENER Führt das Kommando via SSH auf einem entfernten Rechner aus. Auf diesem Rechner muss natürlich auch systemd laufen.
--system Gilt für System-weite Units. Entspricht dem Vorgabewert von systemctl und kann daher auch weggelassen werden. Erfordert stest sudo.
--global Gilt für Units, die nach der Anmeldung für alle Benutzer des Systems angewendet werden sollen. Muss immer mit sudo verwendet werden.
--user Beschränkt sich auf Units des Benutzers, der systemctl ohne Anwendung von sudo unter dem eigenen Konto ausführt.

Eine Übersicht inklusive Erklärung über alle Optionen ist in der Dokumentation 🇩🇪 von systemctl zu finden.

daemon-reload

Der Befehl[1][2]

sudo systemctl daemon-reload 

veranlasst systemd dazu, alle Konfigurationsdateien neu zu laden und alle Units neu zu starten. Dies ist z.B. notwendig, wenn man im laufenden Betrieb eine aktive Unit-Datei editiert hat und die so geänderte Unit direkt nutzen will, jedoch ohne das System neu zu starten.