systemd

systemd-Unit-Datei zum Erstellen eines Dienstes

systemd-Unit-Datei zum Erstellen eines Dienstes
Service Management ist etwas, an das Sie nicht einmal denken, wenn Sie Ihre Linux-Workstation oder Ihren Linux-Server täglich verwenden, aber wenn es nicht da ist, werden Sie es wirklich hassen. Wenn Sie beispielsweise ein neues Serverprogramm erstellen, das rund um die Uhr laufen muss, ist die Bewältigung dieser Herausforderung ohne Service-Management ein Albtraum, bei dem Sie tatsächlich ein kleines Service-System selbst erstellen, das offensichtlich nicht so gut ist wie der von a . entwickelte Manager volles Team seit Jahren sowieso.

Mit seinen Services macht systemd all das einfacher, wirklich einfacher. Sobald Sie Ihre Anwendung überwachen und einfach steuern möchten, ist systemd der richtige Weg, und das werde ich hier erklären!

Wo sind Systemd-Dienste

Um einen neuen Dienst hinzuzufügen, müssen Sie diese Frage beantworten. Wie immer in systemd kommt es darauf an, ob der Dienst nur für Ihren Benutzer oder das gesamte System ist. Wir konzentrieren uns darauf, wie systemd für ganze Systemdienste funktioniert works.

Der genaue Standort hängt davon ab, warum und wie der Dienst installiert wurde. Wenn der Dienst von einem Paketmanager installiert wird, befindet er sich im Allgemeinen in /usr/lib/systemd/system. Für Software, die Sie entwickeln oder die systemd nicht selbst unterstützt, legen Sie die Servicedatei in /usr/local/lib/systemd/system. Beachten Sie jedoch, dass einige Distributionen diesen Ordner in /usr/local nicht unterstützen. Wenn Sie schließlich einen vorhandenen systemd-Dienst konfigurieren möchten, ist /etc/systemd/system der richtige Weg.

In diesen Ordnern finden Sie mehrere Dateierweiterungen wie *.Steckdose, *.Ziel oder *.Bedienung. Natürlich konzentrieren wir uns auf das Letzte. systemd verwendet den Dateinamen als Namen des Dienstes, wenn er gestartet oder gestoppt wird usw. Im Allgemeinen enthalten Dateinamen im Dienst also nur alphanumerische Zeichen zusammen mit Bindestrichen und Unterstrichen. Während der Entwicklung empfehle ich, es in Ihren Dokumenten zu erstellen und es dann zum Systemd-Speicherort zu kopieren, um Probleme zu vermeiden, wenn Sie mitten in der Bearbeitung speichern save.

OK, also erstellen Sie bitte Ihre Servicedatei in Ihren Dokumenten. Jetzt können wir überprüfen, wie diese Datei geschrieben wird.
[Hinweis: Siehe möglichen Fehlerbericht im Kommentarbereich dieses Blogbeitrags]

[Einheit]
Description=Penguins Web Application HTTP-Server (wird in Port 8080 ausgeführt)
WantedBy=Mehrbenutzer.Ziel
 
[Bedienung]
Typ=einfach
ExecStart=/usr/bin/python3 /usr/local/bin/pinguin-web-app/main.py
Neustart = immer

Das Dateiformat ist in der Tat nah an ini. Ich weiß, dass es seltsam sein kann, wenn in Windows oft ini-Dateien gefunden werden, aber so funktioniert es. Die Servicedatei ist zunächst in 2 Abschnitte unterteilt: [Unit] und [Service]. Jeder Abschnitt konfiguriert einen bestimmten Aspekt von systemd: [Unit] enthält Elemente, die von allen systemd-Unit-Dateien gemeinsam genutzt werden, während [Service] nur für die spezifische Konfiguration zum Einrichten eines neuen Dienstes dient.

Anschließend wird der Abschnitt mit Eigenschaften wie Description= oder ExecStart= . konfiguriert. Der Wert wird vom Eigenschaftsnamen durch das Gleichheitszeichen = ohne Leerzeichen getrennt.

Gehen wir zurück zu der oben gezeigten Datei. Es beschreibt einen Dienst, der entwickelt wurde, um eine in Python geschriebene Web-App über Pinguine auszuführen. systemd wird es jedes Mal neu starten, wenn der Prozess beendet wird, und startet den Server beim Start des Servers, wenn Sie es mit dem Befehl systemctl enable aktivieren. Cool eh?

Aber bei deiner nächsten Web-App geht es vielleicht nicht um Pinguine - und das ist schade - und es ist nicht in Python geschrieben. In diesem Fall möchten Sie mehr über die möglichen Konfigurationen erfahren.

Eigenschaften von Systemd-Diensten

Konzentrieren wir uns zunächst auf die Eigenschaften in [Einheit]:

Description= ist nur eine klare Beschreibung dessen, was der Dienst tut. Es wird in der Serviceliste und in den Serviceprotokollen angezeigt, sodass es beschreibend sein soll, aber es sollte in einer Zeile und einem Satz bleiben.

WantedBy= erlaubt systemd zu sagen: Wenn dieses Ding gestartet wird, startet es mich auch. Im Allgemeinen geben Sie den Namen eines Ziels ein. Beispiele für gemeinsame Ziele:

  1. Mehrbenutzer.Ziel: Wenn der Server in Ordnung ist und bereit ist, Befehlszeilenanwendungen auszuführen
  2. grafisch.Ziel: wenn GNOME oder KDE bereit ist
  3. vernetzen.Ziel: wenn der Server richtig mit einem Netzwerk verbunden ist

OK für den Anfang reichen diese Eigenschaften von [Einheit] aus. Werfen wir jetzt einen Blick auf [Service].

Type= hilft systemd, herauszufinden, ob ein Dienst läuft. Hier sind gängige Typen:

  1. Simple wird wahrscheinlich am häufigsten verwendet: systemd betrachtet den Prozess, den Sie starten, als denjenigen, der den Dienst ausführt. Wenn der Prozess stoppt, wird der Dienst auch als gestoppt betrachtet usw.
  2. Forking wird für Anwendungen bevorzugt, die als Server geschrieben wurden, jedoch ohne die Hilfe eines Service-Management-Systems. Grundsätzlich wird erwartet, dass der gestartete Prozess gegabelt wird und dieser Fork als der letzte Prozess für den Dienst angesehen wird. Um genauer zu sein, können Sie systemd auch mit einer PID-Datei helfen, in der die PID des zu verfolgenden Prozesses von der gestarteten Anwendung geschrieben wird.

ExecStart= ist wahrscheinlich das wichtigste für einen Dienst: Es gibt genau an, welche Anwendung beim Starten des Dienstes gestartet werden soll. Wie Sie im Penguin-Dienst sehen können, habe ich /usr/bin/python3 verwendet und nicht sofort python3. Dies liegt daran, dass die systemd-Dokumentation ausdrücklich empfiehlt, absolute Pfade zu verwenden, um Überraschungen zu vermeiden.

Aber das hat auch noch einen anderen Grund. Das Managementsystem anderer Dienste basiert in der Regel auf Shell-Skripten. Allerdings führt systemd aus Leistungsgründen standardmäßig keine Shell aus. Sie können also nicht direkt einen Shell-Befehl in ExecStart= . bereitstellen. Sie können jedoch weiterhin ein Shell-Skript verwenden, indem Sie Folgendes tun:

ExecStart=/usr/bin/bash /usr/local/bin/launch-pinguin-server.Sch

Nicht so schwer richtig? Beachten Sie, dass ExecStop= sowie ExecReload= zum Neuladen von Diensten vorhanden sind, wenn Sie einen Prozess ausführen müssen, um Ihrem Dienst zu signalisieren, dass er sauber beendet wird.

Restart= ermöglicht Ihnen explizit anzugeben, wann der Dienst neu gestartet werden soll. Dies ist eine der wichtigsten Funktionen von systemd: Es stellt sicher, dass Ihr Dienst so lange verfügbar bleibt, wie Sie möchten. Achten Sie also genau auf diese Option.

Neustart= Bedeutung
immer systemd wird es immer wieder neu starten, wenn es beendet wird oder abstürzt. Nun, bis Sie systemctl tun, stoppen Sie service-name.Bedienung.

Es ist perfekt für Server und Online-Dienste, da Sie wenige nutzlose Neustarts dem manuellen Neustart des Dienstes ohne Grund bevorzugen.

auf-abnormal Wenn der Dienstprozess abstürzt, starten Sie den Dienst neu. Wenn die Anwendung jedoch sauber beendet wird, starten Sie sie nicht neu.

Es ist nützlicher für Cron-Jobs wie Dienste, die eine Aufgabe zuverlässig erledigen müssen, aber nicht die ganze Zeit laufen müssen.

bei Fehler Ähnlich wie on-abnormal, aber es startet auch den Dienst neu, wenn die Anwendung sauber beendet wird, jedoch mit einem Exit-Code ungleich nullzer. Exit-Codes ungleich Null bedeuten im Allgemeinen, dass ein Fehler aufgetreten ist.
Nein systemd startet den Dienst nicht automatisch neu.

Im Allgemeinen nützlich, um Zugriff auf andere systemd-Funktionen wie das Protokollieren ohne die Neustartfunktion zu erhalten.

WorkingDirectory= kann beim Starten Ihrer Anwendung ein Arbeitsverzeichnis erzwingen. Der Wert muss ein absoluter Verzeichnispfad sein. Das Arbeitsverzeichnis wird verwendet, wenn Sie im Code Ihrer Anwendung relative Pfade verwenden. Für unseren Pinguinservice könnte es sein:

WorkingDirectory=/srv/pinguin-web-app/

Dann ist Sicherheit wichtig, daher möchten Sie Ihren Dienst im Allgemeinen nicht mit Root-Rechten starten. Mit User= und Group= können Sie den Benutzer- oder Gruppennamen oder die UID/GID festlegen, unter der Ihre Anwendung gestartet wird. Beispielsweise:

Benutzer=pinguin-web
Gruppe=Pinguin-Web

EnvironmentFile= ist eine leistungsstarke Option. Anwendungen, die als Dienste ausgeführt werden, benötigen häufig Konfigurations- und Umgebungsdateien, die es ermöglichen, diese Konfiguration auf zwei Arten festzulegen:

  1. Die Anwendung kann die Umgebungsvariable direkt lesen.
  2. Sie können aber auch verschiedene Befehlszeilenargumente für Ihre Anwendung festlegen, ohne die Servicedatei zu ändern.

Die Syntax dieser Datei ist einfach: Sie geben den Namen der Umgebungsvariablen, das Gleichheitszeichen = und dann den Wert ein. Dann setzen Sie den absoluten Pfad Ihrer Umgebungsdatei in die EnvironmentFile-Eigenschaft.

Also Beispiel:

EnvironmentFile=/etc/pinguin-web-app/environment

Und die Datei /etc/penguin-web-app/environment enthält:

LISTEN_PORT=8080

Dann hat unsere Pinguin-Web-App Zugriff auf die Umgebungsvariable LISTEN_PORT und hört auf den erwarteten Port.

Speichern und starten Sie den neu erstellten Systemd-Dienst

Wenn Sie also meinem Rat gefolgt sind, haben Sie Ihre Servicedatei in Ihrem Home-Verzeichnis bearbeitet. Wenn Sie zufrieden sind, kopieren Sie diese Datei nach /usr/local/lib/systemd/system, vorausgesetzt, Ihre Distribution unterstützt diesen Pfad. Der Dateiname Ihrer Servicedatei ist ihr Servicename. Dieser Dateiname muss mit enden .Bedienung. Für unseren Pinguin-Server wäre es zum Beispiel penguin-web-app.Bedienung.

Dann müssen Sie systemd mitteilen, dass Sie einen neuen Dienst hinzugefügt haben, also müssen Sie diesen Befehl eingeben:

$ sudo systemctl daemon-reload

Okay, jetzt erkennt systemd Ihren neuen Dienst, vorausgesetzt, Ihre Datei enthält keinen Syntaxfehler. Schließlich ist es Ihre erste Datei, daher ist es wahrscheinlich, dass Sie Fehler machen. Sie müssen diesen Befehl oben bei jedem Update in Ihrer Servicedatei ausführen.

Jetzt ist es an der Zeit, den Dienst zu starten:

$ sudo systemctl starte penguin-web-app.Bedienung

Wenn es mit einem Fehler "Einheit nicht gefunden" wie diesem fehlschlägt:

$ sudo systemctl starte penguin-web-app.Bedienung
Fehler beim Starten der Pinguin-Web-App.Service: Gerät nicht gefunden.

Dies bedeutet, dass Ihre Distribution das Verzeichnis nicht unterstützt oder Sie Ihre Servicedatei nicht richtig benannt haben. Schaut unbedingt vorbei.

Wenn Sie Ihren Dienst mit WantedBy= einrichten und möchten, dass Ihr Dienst automatisch startet, müssen Sie ihn mit diesem Befehl aktivieren:

$ sudo systemctl enable penguin-web-app.Bedienung

Das Coole an einem Dienst ist, dass er im Hintergrund läuft. Das Problem: wie man erkennt, ob es richtig läuft und ob es im Hintergrund läuft? Keine Sorge, das systemd-Team hat auch daran gedacht und einen Befehl bereitgestellt, um zu sehen, ob es ordnungsgemäß ausgeführt wird, seit wie viel Zeit usw.:

$ systemctl status pinguin-web-app.Bedienung

Fazit

Glückwunsch! Sie können Ihre Anwendungen jetzt verwalten, ohne sie jedes Mal manuell neu starten zu müssen. Nun empfehle ich Ihnen, unseren anderen Artikel über Systemd-Protokolle zu lesen: Master Journalctl: Systemd-Protokolle verstehen. Damit können Sie das leistungsstarke Logging-System auf Ihrem neuen Dienst verwenden und zuverlässigere Server aufbauen!

Battle for Wesnoth-Tutorial
The Battle for Wesnoth ist eines der beliebtesten Open-Source-Strategiespiele, die Sie derzeit spielen können. Dieses Spiel befindet sich nicht nur se...
0 A.D. Lernprogramm
Von den vielen Strategiespielen da draußen, 0 A.D. schafft es, sich trotz Open Source als umfassender Titel und sehr tiefgehendes, taktisches Spiel ab...
Unity3D-Tutorial
Einführung in Unity 3D Unity 3D ist eine leistungsstarke Engine für die Spieleentwicklung. Es ist plattformübergreifend, das heißt, Sie können Spiele ...