Service Management in Systemd

Deckt systemctl-Workflows zum Starten, Aktivieren, Überwachen und Anpassen von systemd-Services ab.

Services in einem Oracle Linux-System werden mit dem Befehl systemctl subcommand verwaltet.

Beispiele für Unterbefehle sind enable, disable, stop, start, restart, reload und status.

Weitere Informationen finden Sie im Handbuch systemctl(1).

Services starten und stoppen

Zeigt die allgemeinen Befehle systemctl start und systemctl stop an und erläutert, wie Statusänderungen beibehalten werden.

Zum Starten eines Service verwenden Sie den Befehl systemctl start:

sudo systemctl start sshd

Um einen Service zu stoppen, verwenden Sie den Befehl systemctl stop:

sudo systemctl stop sshd

Das Ändern des Status eines Dienstes dauert nur an, während sich das System im selben Status befindet.

Wenn Sie einen Service stoppen und dann das Systemstatusziel in ein Ziel ändern, in dem der Service für die Ausführung konfiguriert ist (z.B. durch einen Neustart des Systems), wird der Service neu gestartet. Ebenso ermöglicht das Starten eines Service nicht, dass der Service nach einem Neustart gestartet wird. Siehe Services aktivieren und deaktivieren.

Services aktivieren und deaktivieren

Erläutert, wie Services aktiviert, deaktiviert, maskiert und unmaskiert werden, sodass sie nach einem Neustart gestartet (oder gestoppt) werden.

Mit dem Befehl systemctl können Sie einen Service beim Booten des Systems aktivieren oder deaktivieren. Beispiel:

sudo systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

Der Befehl enable aktiviert einen Service, indem ein symbolischer Link für das Systemstatusziel der untersten Ebene erstellt wird, bei dem der Service gestartet wird. Im vorherigen Beispiel erstellt der Befehl den symbolischen Link httpd.service für das multi-user-Ziel.

Hinweis

Um den Service gleichzeitig zu starten, fügen Sie die Option --now in den Befehl ein. Beispiel: sudo systemctl enable --now httpd

Wenn Sie einen Service deaktivieren, wird der symbolische Link entfernt:

sudo systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

Um zu prüfen, ob ein Service aktiviert ist, verwenden Sie den Unterbefehl is-enabled (siehe folgende Beispiele):

systemctl is-enabled httpd
disabled
systemctl is-enabled sshd
enabled

Nachdem Sie den Befehl systemctl disable ausgeführt haben, kann der Service weiterhin von Benutzerkonten, Skripten und anderen Prozessen gestartet oder gestoppt werden.

Wenn Sie jedoch sicherstellen müssen, dass der Service nicht versehentlich gestartet werden kann, z.B. durch einen unvereinbaren Service, verwenden Sie den Befehl systemctl mask wie folgt:

sudo systemctl mask httpd
Created symlink from '/etc/systemd/system/multi-user.target.wants/httpd.service' to '/dev/null'

Der Befehl mask legt die Servicereferenz auf /dev/null fest. Wenn Sie versuchen, einen maskierten Service zu starten, erhalten Sie eine Fehlermeldung wie im folgenden Beispiel dargestellt:

sudo systemctl start httpd
Failed to start httpd.service: Unit is masked.

Um die Servicereferenz wieder mit der entsprechenden Konfigurationsdatei der Serviceeinheit zu verknüpfen, verwenden Sie den Befehl systemctl unmask:

sudo systemctl unmask httpd

Weitere Informationen finden Sie im Handbuch systemctl(1).

Status der Services anzeigen

Ausführliche Informationen zu den Befehlen systemctl is-active und status zum Prüfen des Servicezustands und der Kontrollgruppen.

Um zu prüfen, ob ein Service ausgeführt wird, verwenden Sie den Unterbefehl is-active. Die Ausgabe wäre entweder aktiv oder inaktiv, wie in den folgenden Beispielen dargestellt:

systemctl is-active httpd
active
systemctl is-active sshd
inactive

Der Unterbefehl status enthält eine detaillierte Zusammenfassung des Status eines Service, einschließlich eines Baums, der die Aufgaben in der Kontrollgruppe (CGroup) anzeigt, die der Service implementiert:

systemctl status httpd
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since ...
     Docs: man:httpd.service(8)
 Main PID: 11832 (httpd)
   Status: "Started, listening on: port 80"
    Tasks: 213 (limit: 26213)
   Memory: 32.5M
   CGroup: /system.slice/httpd.service
           ├─11832 /usr/sbin/httpd -DFOREGROUND
           ├─11833 /usr/sbin/httpd -DFOREGROUND
           ├─11834 /usr/sbin/httpd -DFOREGROUND
           ├─11835 /usr/sbin/httpd -DFOREGROUND
           └─11836 /usr/sbin/httpd -DFOREGROUND

Jul 17 00:14:32 Unknown systemd[1]: Starting The Apache HTTP Server...
Jul 17 00:14:32 Unknown httpd[11832]: Server configured, listening on: port 80
Jul 17 00:14:32 Unknown systemd[1]: Started The Apache HTTP Server.

Eine cgroup ist eine Zusammenstellung von Prozessen, die miteinander verbunden sind, sodass Sie ihren Zugriff auf Systemressourcen kontrollieren können. Im Beispiel ist cgroup für den httpd-Service httpd.service, der sich im Bereich system befindet.

Bereiche teilen die cgroups auf einem System in verschiedene Kategorien auf. Um den Bereich und die cgroup-Hierarchie anzuzeigen, verwenden Sie den Befehl systemd-cgls:

systemd-cgls
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│   ├─user@1000.service
│   │ └─init.scope
│   │   ├─6488 /usr/lib/systemd/systemd --user
│   │   └─6492 (sd-pam)
│   └─session-7.scope
│     ├─6484 sshd: root [priv]
│     ├─6498 sshd: root@pts/0
│     ├─6499 -bash
│     ├─6524 sudo systemd-cgls
│     ├─6526 systemd-cgls
│     └─6527 less
├─init.scope
│ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 16
└─system.slice
  ├─rngd.service
  │ └─1266 /sbin/rngd -f --fill-watermark=0
  ├─irqbalance.service
  │ └─1247 /usr/sbin/irqbalance --foreground
  ├─libstoragemgmt.service
  │ └─1201 /usr/bin/lsmd -d
  ├─systemd-udevd.service
  │ └─1060 /usr/lib/systemd/systemd-udevd
  ├─polkit.service
  │ └─1241 /usr/lib/polkit-1/polkitd --no-debug
  ├─chronyd.service
  │ └─1249 /usr/sbin/chronyd
  ├─auditd.service
  │ ├─1152 /sbin/auditd
  │ └─1154 /usr/sbin/sedispatch
  ├─tuned.service
  │ └─1382 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
  ├─systemd-journald.service
  │ └─1027 /usr/lib/systemd/systemd-journald
  ├─atd.service
  │ └─1812 /usr/sbin/atd -f
  ├─sshd.service
  │ └─1781 /usr/sbin/sshd

Die system.slice enthält Services und andere Systemprozesse. user.slice enthält Benutzerprozesse, die in transienten Cgroups ausgeführt werden, die als Geltungsbereiche bezeichnet werden.

Im Beispiel werden die Prozesse für den Benutzer mit der ID 1000 im Geltungsbereich session-7.scope unter dem Bereich /user.slice/user-1000.slice ausgeführt.

Mit dem Befehl systemctl können Sie CPU, I/O, Speicher und andere Ressourcen einschränken, die für die Prozesse in Service- und Scope-Cgroups verfügbar sind. Siehe Zugriff auf Systemressourcen steuern.

Weitere Informationen finden Sie in den Handbuchseiten systemctl(1) und systemd-cgls(1). Siehe auch Systemd zum Verwalten von Kontrollgruppen verwenden.

Zugriff auf Systemressourcen steuern

Zeigt, wie Sie mit systemctl set-property und systemd-run CPU- und Speicherlimits für Services und Geltungsbereiche zuweisen.

Mit dem Befehl systemctl steuern Sie den Zugriff einer cgroup auf Systemressourcen. Beispiel:

sudo systemctl [--runtime] set-property httpd CPUShares=512 MemoryLimit=1G

CPUShare steuert den Zugriff auf CPU-Ressourcen. Da der Standardwert 1024 ist, halbiert ein Wert von 512 den Zugriff auf die CPU-Zeit, die Prozesse in der cgroup aufweisen. Entsprechend steuert MemoryLimit den maximalen Arbeitsspeicher, den cgroup verwenden kann.

Hinweis

Sie müssen die Erweiterung .service nicht für den Namen eines Service angeben.

Wenn Sie die Option --runtime angeben, wird die Einstellung nach Systemneustarts nicht beibehalten.

Alternativ können Sie die Ressourceneinstellungen für einen Service unter der Überschrift [Service] in der Konfigurationsdatei des Service in /usr/lib/systemd/system ändern. Nachdem Sie die Datei bearbeitet haben, müssen Sie die Konfigurationsdateien von systemd erneut laden und dann den Service neu starten:

sudo systemctl daemon-reload
sudo systemctl restart service

Sie können allgemeine Befehle innerhalb von Geltungsbereichen ausführen und mit systemctl den Zugriff steuern, den diese transienten Cgroups auf Systemressourcen haben. Um einen Befehl in einem Geltungsbereich auszuführen, verwenden Sie den Befehl systemd-run:

sudo systemd-run --scope --unit=group_name.scope [--slice=slice_name]

Wenn Sie die Gruppe nicht unter dem standardmäßigen system-Bereich erstellen möchten, können Sie einen anderen Bereich oder den Namen eines neuen Bereichs angeben. Im folgenden Beispiel wird ein Befehl mit dem Namen mymonitor in mymon.scope unter myslice.slice ausgeführt:

sudo systemd-run --scope --unit=mymon.scope --slice=myslice mymonitor
Running as unit mymon.scope.
Hinweis

Wenn Sie die Option --scope nicht angeben, wird die Kontrollgruppe als Service und nicht als Geltungsbereich erstellt.

Anschließend können Sie mit systemctl den Zugriff steuern, den ein Geltungsbereich für Systemressourcen auf die gleiche Weise wie für einen Service benötigt. Im Gegensatz zu einem Service müssen Sie jedoch die Erweiterung .scope angeben. Beispiel:

sudo systemctl --runtime set-property mymon.scope CPUShares=256

Weitere Informationen finden Sie unter Systemd zum Verwalten von Kontrollgruppen verwenden und auf den manuellen Seiten systemctl(1), systemd-cgls(1) und systemd.resource-control(5).

Benutzerbasierten systemd-Service erstellen

Zusätzlich zu den systemweiten systemd-Dateien können Sie mit systemd benutzerbasierte Services erstellen, die Sie von einer Benutzerebene aus ausführen können, ohne Root-Zugriff und Berechtigungen zu benötigen. Diese nutzerbasierten Services stehen unter der Kontrolle des Benutzers und sind unabhängig von Systemdiensten konfigurierbar.

Im Folgenden werden einige Unterscheidungsmerkmale von benutzerbasierten systemd-Services aufgeführt:

  • Benutzerbasierte systemd-Services sind mit einem bestimmten Benutzerkonto verknüpft.
  • Sie werden unter dem Home-Verzeichnis des zugehörigen Benutzers in $HOME/.config/systemd/user/ erstellt.
  • Nachdem diese Services aktiviert wurden, werden sie gestartet, wenn sich der zugehörige Benutzer anmeldet. Dieses Verhalten unterscheidet sich von dem der aktivierten systemd-Services, die beim Booten des Systems gestartet werden.

Diese Funktion ist besonders nützlich beim Erstellen von Podman-Containerservices. Weitere Informationen zu Podman finden Sie im Oracle Linux: Podman User's Guide.

So erstellen Sie einen benutzerbasierten Service:

  1. Erstellen Sie die Unit-Datei des Service im Verzeichnis $HOME/.config/systemd/user. Beispiel:
    touch $HOME/.config/systemd/user/myservice.service
  2. Öffnen Sie die Unit-Datei, und geben Sie die Werte für die Optionen an, die Sie verwenden möchten, wie Description, ExecStart, WantedBy usw.
    Weitere Informationen finden Sie unter Konfigurierbare Optionen in Service Unit-Dateien und auf den manuellen Seiten systemd.service(5) und systemd.unit(5).
  3. Aktivieren Sie, dass der Service automatisch gestartet wird, wenn Sie sich anmelden.
    systemctl --user enable myservice.service
    Hinweis

    Wenn Sie sich abmelden, wird der Service gestoppt, es sei denn, der Root-Benutzer hat aktiviert, dass Prozesse für den Benutzer weiter ausgeführt werden.

    Weitere Informationen finden Sie unter https://docs.oracle.com/en/learn/ol-systemd/.

  4. Starten Sie den Service.
    systemctl --user start myservice.service
  5. Prüfen Sie, ob der Service ausgeführt wird.
    systemctl --user status myservice.service

Ändern von systemd Service Unit-Dateien

Beschreibt, wie Sie gepackte Unit-Dateien außer Kraft setzen und Drop-in-Snippets unter /etc/systemd/system erstellen.

Um die Konfiguration der systemd-Services zu ändern, kopieren Sie die Dateien mit den Erweiterungen .service, .target, .mount und .socket von /usr/lib/systemd/system in /etc/systemd/system.

Nachdem Sie die Dateien kopiert haben, können Sie die Versionen in /etc/systemd/system bearbeiten.

Die Dateien in /etc/systemd/system haben Vorrang vor den Versionen in /usr/lib/systemd/system. Dateien in /etc/systemd/system werden nicht überschrieben, wenn Sie ein Paket aktualisieren, das Dateien in /usr/lib/systemd/system berührt.

Um die standardmäßige systemd-Konfiguration für einen bestimmten Service wiederherzustellen, können Sie die Kopien in /etc/systemd/system umbenennen oder löschen.

Eine weitere Möglichkeit, die Konfiguration eines Service zu ändern, besteht darin, eine Drop-in-Datei zu erstellen. Mit diesem Ansatz können Sie die ursprüngliche Einheit beibehalten, während Sie bestimmte Parameter der Einheit ändern.

Erstellen Sie Drop-in-Dateien in /etc/systemd/system/unit_name.d/, wobei das Verzeichnis unit_name.d eine vorhandene Einheit ist, und geben Sie den Drop-in-Dateien die Dateierweiterung .conf.

Beispiel: /etc/systemd/system/unit_name.d/name_of_drop-in.conf. systemd liest die Datei .conf und wendet die Einstellungen auf die ursprüngliche Einheit an.

In den folgenden Abschnitten werden die verschiedenen Teile einer Serviceeinheitendatei beschrieben, die Sie für ein System bearbeiten und anpassen können.

Informationen zu Serviceeinheitendateien

Services werden basierend auf den entsprechenden Service Unit-Dateien ausgeführt. Eine Service Unit-Datei enthält in der Regel die folgenden Abschnitte, wobei jeder Abschnitt über die entsprechenden definierten Optionen verfügt, die bestimmen, wie ein bestimmter Service ausgeführt wird:

[Unit]

Enthält Informationen zum Service.

[UnitType]:

Enthält Optionen, die für den Einheitentyp der Datei spezifisch sind. Beispiel: In einer Serviceeinheitendatei heißt dieser Abschnitt [Service] und enthält Optionen, die für Einheiten des Servicetyps spezifisch sind, wie ExecStart oder StandardOutput.

Nur die Einheitentypen, die spezifische Optionen für ihre Art anbieten, weisen einen solchen Abschnitt auf.

[Install]

Enthält Installationsinformationen für die spezifische Einheit. Die Informationen in diesem Abschnitt werden von den Befehlen systemctl enable und systemctl disable verwendet.

Eine Serviceeinheitendatei kann die folgenden Konfigurationen für einen Service enthalten.

[Unit]
Description=A test service used to develop a service unit file template

[Service]
Type=simple
StandardOutput=journal
ExecStart=/usr/lib/systemd/helloworld.sh

[Install]
WantedBy=default.target

Unter Konfigurierbare Optionen in Service Unit-Dateien werden einige häufig verwendete konfigurierte Optionen beschrieben, die in jedem Abschnitt verfügbar sind. Eine vollständige Liste finden Sie auch auf den Handbuchseiten systemd.service(5) und systemd.unit(5).

Konfigurierbare Optionen in Serviceeinheitendateien

Jede der folgenden Listen behandelt einen separaten Abschnitt der Serviceeinheitendatei.

Beschreibung der Optionen unter Abschnitt [Einheit]

Die folgende Liste enthält einen allgemeinen Überblick über die häufig verwendeten konfigurierbaren Optionen, die im Abschnitt [Unit] der Serviceeinheitendatei verfügbar sind:

Description

Liefert Informationen über den Service. Die Informationen werden angezeigt, wenn Sie den Befehl systemctl status auf der Einheit ausführen.

Documentation

Enthält eine durch Leerzeichen getrennte Liste von URIs, die auf die Dokumentation für diese Einheit oder ihre Konfiguration verweisen.

After

Konfiguriert, dass die Einheit nur ausgeführt wird, nachdem die in der Option aufgeführten Einheiten gestartet wurden.

Wenn die Datei var3.service im folgenden Beispiel den folgenden Eintrag enthält, wird sie erst gestartet, nachdem die Einheiten var1.service und var2.service gestartet wurden:

 After=var1.service var2.service
Requires

Konfiguriert eine Einheit mit Anforderungsabhängigkeiten von anderen Einheiten. Wenn eine Einheit aktiviert ist, werden auch die in ihrer Option Requires aufgeführten aktiviert.

Wants

Eine weniger strenge Version der Option Requires. Beispiel: Eine bestimmte Einheit kann aktiviert werden, auch wenn eine der in ihrer Option Wants aufgeführten Einheiten nicht gestartet werden kann.

Beschreibung der Optionen unter Abschnitt [Service]

Diese folgende Liste enthält einen allgemeinen Überblick über die häufig verwendeten konfigurierbaren Optionen, die im Abschnitt [Service] einer Serviceeinheitendatei verfügbar sind.

Type

Konfiguriert den Prozessstarttyp für die Serviceeinheit.

Standardmäßig ist der Wert dieses Parameters simple. Dies gibt an, dass der Hauptprozess des Service derjenige ist, der mit dem Parameter ExecStart gestartet wurde.

Wenn der Typ eines Service simple lautet, kann die Definition in der Datei ausgelassen werden.

StandardOutput
Konfiguriert, wie die Ereignisse des Service protokolliert werden. Beispiel: Eine Service Unit-Datei enthält den folgenden Eintrag:
StandardOutput=journal

Im Beispiel gibt der Wert journal an, dass die Ereignisse im Journal aufgezeichnet werden. Dieser Wert kann mit dem Befehl journalctl angezeigt werden.

ExecStart

Gibt den vollständigen Pfad und den Befehl an, der den Service startet, z.B. /usr/bin/npm start.

ExecStop

Gibt die Befehle an, die ausgeführt werden müssen, um den über ExecStart gestarteten Service zu stoppen.

ExecReload

Gibt die Befehle an, die ausgeführt werden müssen, um ein erneutes Laden der Konfiguration im Service auszulösen.

Restart

Konfiguriert, ob der Service neu gestartet werden soll, wenn der Serviceprozess beendet, gestoppt oder ein Timeout erreicht wird.

Hinweis

Diese Option gilt nicht, wenn der Prozess durch einen systemd-Vorgang ordnungsgemäß gestoppt wird, z.B. systemctl stop oder systemctl restart. In diesen Fällen wird der Service nicht mit dieser Konfigurationsoption neu gestartet.
RemainAfterExit

Ein boolescher Wert, der konfiguriert, ob der Service auch dann als aktiv betrachtet werden soll, wenn alle seine Prozesse beendet wurden. Der Standardwert ist no.

Beschreibung der Optionen unter [Install] Abschnitt

Diese folgende Liste enthält einen allgemeinen Überblick über die häufig verwendeten konfigurierbaren Optionen, die im Abschnitt [Install] der Serviceeinheitendatei verfügbar sind.

Alias

Eine durch Leerzeichen getrennte Liste der Namen für eine Einheit.

Bei der Installation erstellt systemctl enable Symlinks von diesen Namen zum Dateinamen der Einheit.

Aliasnamen sind nur gültig, wenn die Einheit aktiviert ist.

RequiredBy

Konfiguriert den Service, der für andere Einheiten erforderlich ist.

Beispiel: Eine Unit-Datei var1.service, der die folgende Konfiguration hinzugefügt wurde:

RequiredBy=var2.service var3.service

Wenn var1.service aktiviert ist, wird sowohl var2.service als auch var3.service eine Requires-Abhängigkeit von var1.service erteilt. Diese Abhängigkeit wird durch einen symbolischen Link definiert, der im Ordner .requires jedes abhängigen Service (var2.service und var3.service) erstellt wird, der auf die Systemeinheitendatei var1.service verweist.

WantedBy

Gibt eine Liste der Einheiten an, denen eine wants-Abhängigkeit von dem Service erteilt werden soll, dessen Datei Sie bearbeiten.

Beispiel: Eine Unit-Datei var1.service, der die folgende Konfiguration hinzugefügt wurde:

WantedBy=var2.service var3.service

Wenn var1.service aktiviert ist, wird sowohl var2.service als auch var3.service eine Wants-Abhängigkeit von var1.service erteilt. Diese Abhängigkeit wird durch einen symbolischen Link definiert, der im Ordner ".wants" jedes abhängigen Service (var2.service und var3.service) erstellt wird, der auf die Systemeinheitendatei für var1.service verweist.

Also

Listet zusätzliche Einheiten auf, die installiert oder entfernt werden sollen, wenn das Gerät installiert oder entfernt wird.

DefaultInstance

Die Option DefaultInstance gilt nur für Vorlagendateien.

Mit Template Unit-Dateien können Sie mehrere Einheiten aus einer einzelnen Konfigurationsdatei erstellen. Die Option DefaultInstance gibt die Instanz an, für die die Einheit aktiviert ist, wenn die Vorlage ohne explizit festgelegte Instanz aktiviert ist.

Einzugsdatei für Einheiten erstellen

Mit dem Befehl systemctl edit können Sie automatisch eine Systemd Unit-Drop-in- oder Unit-Datei für eine vorhandene Systemd Unit generieren. Mit der Drop-in-Datei können Sie die Basiskonfiguration für eine Einheit außer Kraft setzen oder die Anforderungen für eine Einheitendatei erweitern.

  1. Führen Sie den Befehl systemctl edit <unit> aus, um automatisch eine systemd drop-in-Datei zu generieren und die Datei im Standard-Editor des Systems zu öffnen.

    Beispiel: Um die Einheit cockpit.socket zu bearbeiten und den Port zu ändern, den die Cockpit-Webkonsole überwacht, können Sie Folgendes tun:

    sudo systemctl edit cockpit.socket --drop-in=listen.conf

    Mit der Option --drop-in können Sie den Dateinamen angeben, der für die Drop-in-Datei verwendet wird. Wenn Sie diese Option nicht angeben, wird der Standarddateiname auf override.conf gesetzt.

    Der Systemtexteditor wird geöffnet, und Sie können die Zeilen hinzufügen, um die Standardkonfiguration zu überschreiben:

    [Socket]
    ListenStream=
    ListenStream=443
    Hinweis

    Wenn Sie den Standard-Listener-Port für Cockpit ändern, ist eine weitere Konfiguration außerhalb von systemd erforderlich. Beispiel: Sie müssen SELinux-Kontexte und die Firewallkonfiguration ändern.
  2. Speichern Sie die Drop-in-Datei, oder beenden Sie den Vorgang.
    Wenn Sie die Änderungen an der Drop-in-Datei speichern, wird die Datei automatisch in /etc/systemd/system/<unit>.d/<drop-in.file> installiert. Wenn Sie den Editor verlassen, ohne die Änderungen zu speichern, wird die Datei nicht erstellt, und es sind keine weiteren Aktualisierungen erforderlich.
  3. Laden Sie die Systemd Daemon-Konfiguration neu.
    sudo systemctl daemon-reload
  4. Starten Sie die Systemeinheit, die Sie aktualisiert haben, neu.

    Beispiel: Um die in diesem Beispiel verwendete cockpit.socket neu zu starten, führen Sie folgenden Befehl aus:

    sudo systemctl restart cockpit.socket