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.
Um den Service gleichzeitig zu starten, fügen Sie die Option --now in den Befehl ein. Beispiel:
sudo systemctl enable --now httpdWenn 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.
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.
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:
Ä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, wieExecStartoderStandardOutput.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 statusauf 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.
serviceim folgenden Beispiel den folgenden Eintrag enthält, wird sie erst gestartet, nachdem die Einheitenvar1.serviceundvar2.servicegestartet 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
Requiresaufgeführten aktiviert. -
Wants -
Eine weniger strenge Version der Option
Requires. Beispiel: Eine bestimmte Einheit kann aktiviert werden, auch wenn eine der in ihrer OptionWantsaufgefü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 ParameterExecStartgestartet wurde.Wenn der Typ eines Service
simplelautet, 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=journalIm Beispiel gibt der Wert
journalan, dass die Ereignisse im Journal aufgezeichnet werden. Dieser Wert kann mit dem Befehljournalctlangezeigt 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
ExecStartgestarteten 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 einensystemd-Vorgang ordnungsgemäß gestoppt wird, z.B.systemctl stopodersystemctl 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 enableSymlinks 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.serviceWenn
var1.serviceaktiviert ist, wird sowohlvar2.serviceals auchvar3.serviceeineRequires-Abhängigkeit vonvar1.serviceerteilt. Diese Abhängigkeit wird durch einen symbolischen Link definiert, der im Ordner.requiresjedes abhängigen Service (var2.serviceundvar3.service) erstellt wird, der auf die Systemeinheitendateivar1.serviceverweist. -
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.serviceWenn
var1.serviceaktiviert ist, wird sowohlvar2.serviceals auchvar3.serviceeineWants-Abhängigkeit vonvar1.serviceerteilt. Diese Abhängigkeit wird durch einen symbolischen Link definiert, der im Ordner ".wants" jedes abhängigen Service (var2.serviceundvar3.service) erstellt wird, der auf die Systemeinheitendatei fürvar1.serviceverweist. -
Also -
Listet zusätzliche Einheiten auf, die installiert oder entfernt werden sollen, wenn das Gerät installiert oder entfernt wird.
-
DefaultInstance -
Die Option
DefaultInstancegilt nur für Vorlagendateien.Mit Template Unit-Dateien können Sie mehrere Einheiten aus einer einzelnen Konfigurationsdatei erstellen. Die Option
DefaultInstancegibt 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.