[[Vorlage(Getestet, focal, jammy)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:sudo: Root-Rechte] }}} [[Inhaltsverzeichnis()]] '''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]: {{{#!vorlage Befehl 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 [:man: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: {{{#!vorlage Tabelle <-2 rowclass="titel">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 [https://manpages.debian.org/testing/manpages-de/systemctl.1.de.html#Unit-Befehle_(Untersuchung_und_Ver%C3%A4nderung) Dokumentation auf Debian] {de} 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. {{{#!vorlage Tabelle <-2 rowclass="titel">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 [https://manpages.debian.org/testing/manpages-de/systemctl.1.de.html#Unit-Dateibefehle Dokumentation auf Debian] {de} 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 [:systemd/Units/#systemweite-Units: System-Standardpfaden] bzw. [:systemd/User_Units/#Speicherorte: 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 {{{#!vorlage Befehl sudo systemctl daemon-reload }}} bzw. einem {{{#!vorlage Befehl systemctl --user daemon-reload }}} entspricht. `systemtl edit` kann mit den [#Optionen 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: {{{#!vorlage Tabelle <-2 rowclass="titel">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/#systemweite-Units:] und [:systemd/User_Units/#Speicherorte:]. Beim Bearbeiten und Neuanlegen einer Unit-Datei muss außerdem auf deren [:systemd/Units/#Eigene-Units-anlegen: 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 {{{#!vorlage befehl 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> [mark] ... [/mark] ### Lines below this comment will be discarded }}} 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''. {{{#!vorlage befehl 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 {{{#!vorlage Befehl sudo systemctl edit --full --force UNITNAME }}} Die neue Unit-Datei wird in diesem Fall ebenfalls im entsprechenden Ablage-Verzeichnis (s.o.) angelegt. {{{#!vorlage 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: {{{#!vorlage Tabelle <-2 rowclass="titel">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 [https://manpages.debian.org/testing/manpages-de/systemctl.1.de.html#Systembefehle Dokumentation] {de} von systemctl zu finden. == Optionen == Im folgenden werden einige Optionen von systemctl aufgeführt: {{{#!vorlage Tabelle <-2 rowclass="titel">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 [:systemd/Units: 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 [:systemd/User_Units: 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 [https://manpages.debian.org/testing/manpages-de/systemctl.1.de.html#OPTIONEN Dokumentation] {de} von systemctl zu finden. == daemon-reload == Der Befehl[1][2] {{{#!vorlage Befehl 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. = Links = * [:systemd/Service Units:] - Wikiartikel zu systemd Service Units * [:systemd/User_Units:] - Wikiartikel zu systemd Benutzer Units * [:systemd/Timer Units:] - Wikiartikel zu systemd Timer Units * [https://manpages.debian.org/testing/manpages-de/systemctl.1.de.html Dokumentation auf Debian] {de} von systemctl * [http://www.freedesktop.org/software/systemd/man/systemctl.html komplette Dokumentation] {en} von systemctl #tag: System, systemd, hibernate