So erstellen Sie die Systemd -Service -Einheit unter Linux
- 3982
- 929
- Miriam Bauschke
Obwohl Systemd Gegenstand vieler Kontroversen war, wurden die einige Verteilungen bis zu dem Punkt gegabelt, um es zu beseitigen (siehe Devuan, eine Gabel von Debian, die systemd durch sysvinit ersetzt), ist es am Ende der geworden De-facto Standard Init-System in der Linux-Welt.
In diesem Tutorial werden wir sehen, wie ein Systemd -Dienst strukturiert ist, und wir werden lernen, wie man einen erstellt.
In diesem Tutorial lernen Sie:
- Was ist eine Serviceinheit…
- Was sind die Abschnitte einer Serviceeinheit?.
- Was sind die häufigsten Optionen, die in jedem Abschnitt verwendet werden können.
- Was sind die verschiedenen Arten von Service, die definiert werden können.
Softwareanforderungen und Konventionen verwendet
Kategorie | Anforderungen, Konventionen oder Softwareversion verwendet |
---|---|
System | Eine GNU/Linux -Verteilung, die systemd als Init -System verwendet |
Software | systemd |
Andere | Root -Berechtigungen sind zur Installation und Verwaltung eines Dienstes erforderlich. |
Konventionen | # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können |
Das Systemd Init -System
Alle wichtigen Verteilungen wie Rhel, Centos, Fedora, Ubuntu, Debian und Archlinux haben Systemd als Init -System übernommen. Systemd ist eigentlich mehr als nur ein Init -System, und das ist einer der Gründe, warum manche Menschen stark gegen das Design sind, was gegen das gut etablierte Unix -Motto widerspricht: „Mach eins und mach es gut.“. Wenn andere Init -Systeme ein einfaches Shell -Skript verwenden, um Dienste zu verwalten, verwendet Systemd seine eigenen .Service
Dateien (Einheiten mit dem .Service -Suffix): In diesem Tutorial werden wir sehen, wie sie strukturiert sind und wie man einen erstellt und installiert.
Anatomie einer Serviceinheit
Was ist eine Serviceinheit?? Eine Datei mit der .Service
Suffix enthält Informationen zu einem Prozess, der von Systemd verwaltet wird. Es besteht aus drei Hauptabschnitten:
- [Einheit]: Dieser Abschnitt enthält Informationen, die nicht speziell mit dem Typ des Geräts zusammenhängen, wie z. B. der Servicebeschreibung
- [Service]: Enthält Informationen über den spezifischen Typ des Geräts, einen Dienst in diesem Fall
- [Install]: Dieser Abschnitt enthält Informationen zur Installation des Geräts
Lassen Sie uns jeden von ihnen ausführlich analysieren.
Der Abschnitt [Einheit]
Der [Einheit]
Abschnitt von a .Service
Die Datei enthält die Beschreibung des Geräts selbst und Informationen über das Verhalten und ihre Abhängigkeiten: (Um korrekt zu arbeiten, kann ein Dienst von einem anderen abhängen). Hier diskutieren wir einige der relevantesten Optionen, die in diesem Abschnitt verwendet werden können
Die Option "Beschreibung"
Erstens haben wir das Beschreibung
Möglichkeit. Durch die Verwendung dieser Option können wir eine Beschreibung des Geräts bereitstellen. Die Beschreibung wird dann beispielsweise beim Aufrufen der Systemctl
Befehl, der einen Überblick über den Status von Systemd zurückgibt. Hier ist es als Beispiel, wie die Beschreibung von httpd
Der Service ist auf einem Fedora -System definiert:
[Einheit] Beschreibung = der Apache HTTP -Server
Die Option "After"
Durch Verwendung der Nach
Option können wir angeben, dass unsere Einheit nach den Einheiten gestartet werden sollte, die wir in Form einer platz getrennten Liste bereitstellen. Wenn Sie beispielsweise die Dienstdatei erneut beobachten, in der der Apache -Webdienst definiert ist, können wir Folgendes sehen:
Nach = Netzwerk.Ziel-Remote-FS.Ziel NSSS-Lookup.Ziel httpd-init.Service
Die obige Linie weist Systemd an, die Serviceinheit zu starten httpd.Service
Nur nach dem Netzwerk
, FS-FS entfernen
, NSS-Lookup
Ziele und die HTTPD-Init-Service
.
Angabe harter Abhängigkeiten mit "Erforderlich"
Wie wir oben kurz erwähnt haben, kann eine Einheit (ein Dienst in unserem Fall) von anderen Einheiten (nicht unbedingt „Service“ -Inits) abhängen, um korrekt zu arbeiten: Solche Abhängigkeiten können mit der Verwendung der verwendet werden Erfordert
Möglichkeit.
Wenn eine der Einheiten, von denen ein Dienst abhängt, nicht beginnt, wird die Aktivierung des Dienstes gestoppt: Deshalb werden diese aufgerufen harte Abhängigkeiten
. In dieser Zeile können wir sehen, wie sie aus der Servicedatei des Avahi-daemon extrahiert werden.Sockeleinheit:
Erfordert = avahi-daemon.Steckdose
Deklarieren Sie "weiche" Abhängigkeiten mit "Wants"
Wir haben gerade gesehen Erfordert
Möglichkeit; Wir können auch "weiche" Abhängigkeiten auflisten, indem wir die verwenden Will
Möglichkeit.
Was ist der Unterschied? Wie bereits erwähnt, wird der Dienst selbst fehlschlagen, wenn eine „harte“ Abhängigkeit fehlschlägt. Ein Versagen einer „weichen“ Abhängigkeit beeinflusst jedoch keinen Einfluss auf das, was mit der abhängigen Einheit passiert. In dem vorgesehenen Beispiel können wir sehen, wie die Docker.Service
Die Einheit hat eine weiche Abhängigkeit von der Docker-Storage-Setup.Service
eins:
[Einheit] Wants = Docker-Storage-Setup.Service
Der Abschnitt [Dienst]
Im [Service]
Abschnitt von a Service
Einheit können wir Dinge als den Befehl angeben, der ausgeführt wird, wenn der Dienst gestartet wird, oder als der Typ des Dienstes selbst. Schauen wir uns einige von ihnen an.
Starten, Stoppen und Nachladen eines Dienstes
Ein Service kann gestartet, gestoppt, neu gestartet oder neu geladen werden. Die Befehle, die bei der Ausführung jeder dieser Aktionen ausgeführt werden sollen [Service]
Abschnitt.
Der Befehl, der ausgeführt wird, wenn ein Dienst beginnt ExecStart
Möglichkeit. Das an die Option übergebene Argument kann auch der Weg zu einem Skript sein. Optional können wir die Befehle deklarieren, die vor und nach dem Start des Dienstes ausgeführt werden sollen, indem wir die verwenden, indem wir die verwenden ExecStartPre
Und ExecStartPost
Optionen. Hier ist der Befehl zum Starten des NetworkManager -Dienstes:
[Service] execstart =/usr/sbin/networkManager-no-daemon
In ähnlicher Weise können wir den Befehl angeben, der ausgeführt wird, wenn ein Dienst neu geladen oder gestoppt wird, indem wir die verwenden ExecStop
Und Execreload
Optionen. Ähnlich wie mit dem, was mit ExecStartPost
, Ein Befehl oder mehrere Befehle, die nach gestopptem Prozess gestartet werden sollen, kann mit dem angegeben werden Execstoppost
Möglichkeit.
Die Art des Dienstes
Systemd definiert und unterscheidet zwischen unterschiedlichen Diensten, abhängig von ihrem erwarteten Verhalten. Die Art eines Dienstes kann durch die Verwendung der Verwendung definiert werden Typ
Option, Bereitstellung eines dieser Werte:
- einfach
- Gabel
- Oneshot
- dbus
- benachrichtigen
Der Standardtyp eines Dienstes, wenn die Typ
Und Busname
Optionen werden nicht definiert, aber ein Befehl wird über die bereitgestellt ExecStart
Option ist einfach
. Wenn diese Art von Dienst festgelegt ist, wurde der Befehl deklariert ExecStart
wird als Hauptprozess/Service angesehen.
Der Gabel
Typ funktioniert anders ExecStart
Es wird erwartet, dass er einen Kinderprozess aufgibt und der Hauptprozess/Service wird. Der übergeordnete Prozess wird erwartet, dass der Startprozess vorbei ist.
Der Oneshot
Typ wird als Standard verwendet, wenn die Typ
Und ExecStart
Optionen sind nicht definiert. Es funktioniert ziemlich ähnlich einfach
: Der Unterschied besteht darin, dass der Prozess voraussichtlich seinen Job beenden wird, bevor andere Einheiten gestartet werden. Die Einheit gilt jedoch immer noch als „aktiv“, auch wenn der Befehl beendet ist, wenn der RemaFterexit
Die Option ist auf "Ja" gesetzt (der Standard ist "Nein").
Die nächste Art von Service ist dbus
. Wenn diese Art von Dienst verwendet wird Dbus
, wie in der angegeben Busname
Option, die in diesem Fall obligatorisch wird. Für den Rest funktioniert es wie das einfach
Typ. Folgende Einheiten werden jedoch erst nach dem Erwerb des DBUS -Namens gestartet.
Ein anderer Prozess funktioniert ähnlich wie einfach
, und es ist benachrichtigen
: Der Unterschied besteht darin, dass der Dämon eine Benachrichtigung über die sendet sd_notify
Funktion. Nur wenn diese Benachrichtigung gesendet wird.
Legen Sie die Prozesszeitüberschreitungen fest
Durch die Verwendung bestimmter Optionen können einige Zeitüberschreitungen für den Dienst definiert werden. Lass uns beginnen mit Neustart
: Durch die Verwendung dieser Option können wir den Zeitaufwand (standardmäßig in Sekunden) einrichten, das vor dem Neustart eines Dienstes warten sollte. Ein Timesspan kann auch als Wert für diese Option als „5 -minütige 20er“ verwendet werden. Der Standard ist 100 ms
.
Der TimeoutStartSec
Und TimeoutStopsec
Mit Optionen können die Zeitüberschreitung für ein Service -Startup und Stopp in Sekunden angegeben werden. Im ersten Fall wird nach der angegebenen Zeitüberschreitung des Startprozesses des Daemon nicht abgeschlossen, dass er fehlgeschlagen ist.
Im zweiten Fall, wenn ein Dienst gestoppt werden soll, aber nach dem angegebenen Zeitübergang nicht beendet wird, ist zunächst a Sigterm
und dann nach der gleichen Zeit a Sigkill
Signal werden darauf gesendet. Beide Optionen akzeptieren auch einen Zeitraum als Wert und können gleichzeitig mit einer Abkürzung konfiguriert werden: Timeoutsc
. Wenn Unendlichkeit
wird als Wert bereitgestellt, die Zeitüberschreitungen sind deaktiviert.
Schließlich können wir die Grenze für die Zeit, die ein Dienst ausgeführt wird Runtimemaxsec
. Wenn ein Dienst diesen Zeitüberschreitungen überschreitet, wird er gekündigt und als fehlgeschlagen angesehen.
Der Abschnitt [Installation]
Im [Installieren]
Abschnitt können wir Optionen zur Serviceinstallation verwenden. Zum Beispiel mit der Verwendung der Alias
Option können wir eine von Speicherplatz getrennte Liste von Aliase angeben, die für den Dienst verwendet werden sollen ermöglichen
).
Ähnlich wie mit dem passiert Erfordert
Und Will
Optionen in der [Einheit]
Abschnitt, um Abhängigkeiten festzulegen, in der [Installieren]
Abschnitt können wir verwenden Benötigt von
Und Gesucht von
. In beiden Fällen deklarieren wir eine Liste von Einheiten, die von der von uns konfigurierenden Abhängigkeiten abhängen. Zum Beispiel:
[Install] wantby = multi-user.Ziel
Mit der obigen Linie erklärten wir, dass die Multi-Benutzer
Target hat eine weiche Abhängigkeit von unserem Gerät. In der Systemd -Terminologie enden Einheiten mit dem .Ziel
Suffix kann mit dem in Verbindung gebracht werden, was genannt wurde Laufzeiten
in anderen Init -Systemen als Sysvinit
. In unserem Fall sollte das Multi-User-Ziel, wenn er erreicht ist, unseren Service einschließen.
Erstellen und Installieren einer Serviceeinheit
Grundsätzlich gibt es zwei Orte im Dateisystem, an denen Systemd Service -Einheiten installiert sind: /usr/lib/systemd/system
Und /etc/systemd/system
. Der erstere Pfad wird für Dienste verwendet, die von installierten Paketen bereitgestellt werden, während der letztere vom Systemadministrator für seine eigenen Dienste verwendet werden kann, die die Standardeinstellungen überschreiben können.
Erstellen wir ein benutzerdefiniertes Dienstbeispiel. Nehmen wir an, wir möchten einen Dienst erstellen, der die Wake-on-LAN-Funktion auf einer bestimmten Ethernet-Schnittstelle (in unserem Fall) bei Beginn der Ethernet-Schnittstelle (ENS5F5. Wir können die verwenden Ethtool
Befehl zur Erfüllung der Hauptaufgabe. So könnte unsere Servicedatei aussehen:
[Einheit] Beschreibung = Kraft ENS5F5 Ethernet -Schnittstelle zu 100 Mbit / s erfordert = Netzwerk.Ziel nach = Netzwerk.Ziel [Service] Typ = OneShot Restexit = yes execstart =/usr/sbin/ethtool -s ENS5F5 Wol d execStop =/usr/sbin/Ethtool -s ENS5F5 Wol G [install] suchtby = multi -user.Ziel
Wir setzen eine einfache Beschreibung der Einheit und erklärten, dass der Service von der abhängt Netzwerk.Ziel
Einheit und sollte gestartet werden, nachdem es erreicht wurde. Im [Service]
Abschnitt Wir setzen den Typ des Dienstes als Oneshot
, und angewiesene Systemd, den Dienst als aktiv zu betrachten, nachdem der Befehl ausgeführt wurde, mit dem RemaFterexit
Möglichkeit. Wir haben auch die Befehle definiert, die ausgeführt werden sollen, wenn der Dienst gestartet und gestoppt wird. Schließlich in der [Installieren]
Abschnitt Wir haben im Grunde erklärt, dass unser Dienst in der enthalten sein sollte Multi-Benutzer
Ziel.
Um den Dienst zu installieren, kopieren wir die Datei in die /etc/systemd/system
Verzeichnis als Wol.Service
, als wir werden damit beginnen:
$ sudo cp Wol.Service/etc/systemd/system && sudo systemctl starten wol.Service
Wir können überprüfen, ob der Dienst mit dem folgenden Befehl aktiv ist:
$ systemctl is-active Wol.Service aktiv
Die Ausgabe des Befehls ist erwartungsgemäß wie erwartet aktiv
. Nun zu überprüfen, ob „Wake on lan“ aufgestellt wurde D
, Und so ist es jetzt deaktiviert, wir können ausführen:
$ sudo Ethtool ENS5F5 | Grep Wake-on unterstützt Wake-on: PG Wake-on: D
Wenn Sie nun den Service stoppen, sollte das umgekehrte Ergebnis und das wiederum nachwache Wol:
$ sudo systemctl stop Wol.Service && sudo Ethtool ENS5F5 | Grep Wake-on unterstützt Wake-on: PG Wake-on: G
Schlussfolgerungen
In diesem Tutorial haben wir gesehen. Wir haben gelernt, wie man eine Dienstbeschreibung einstellt, ihre Abhängigkeiten definiert und die Befehle deklariert werden, die beim Start, gestoppt oder neu geladen werden sollten.
Da Systemd, wie es oder nicht, zum Standard -Init -System in der Linux -Welt geworden ist, ist es wichtig, sich seiner Art, Dinge zu tun, vertraut zu werden. Die offizielle Dokumentation von Systemd Services finden Sie auf der FreedSktop -Website. Sie könnten auch daran interessiert sein, unseren Artikel über das Verwalten von Diensten mit Systemd zu lesen.
Verwandte Linux -Tutorials:
- Dinge zu installieren auf Ubuntu 20.04
- Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
- Wie man Linux stürzt
- Mint 20: Besser als Ubuntu und Microsoft Windows?
- Linux -Download
- Hung Linux System? Wie man zur Befehlszeile entkommt und…
- Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
- Eine Einführung in Linux -Automatisierung, Tools und Techniken
- Linux -Befehle: Top 20 wichtigste Befehle, die Sie benötigen, um…
- Grundlegende Linux -Befehle
- « So installieren Sie den Postfix -Mailserver auf RHEL 8 / CentOS 8
- So verschlüsseln Sie Ihre DNS mit DNScrypt auf Ubuntu und Debian »