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]
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:
- Mehrbenutzer.Ziel: Wenn der Server in Ordnung ist und bereit ist, Befehlszeilenanwendungen auszuführen
- grafisch.Ziel: wenn GNOME oder KDE bereit ist
- 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:
- 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.
- 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.SchNicht 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-webGruppe=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:
- Die Anwendung kann die Umgebungsvariable direkt lesen.
- 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/environmentUnd die Datei /etc/penguin-web-app/environment enthält:
LISTEN_PORT=8080Dann 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-reloadOkay, 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.BedienungWenn es mit einem Fehler "Einheit nicht gefunden" wie diesem fehlschlägt:
$ sudo systemctl starte penguin-web-app.BedienungFehler 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.BedienungDas 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.BedienungFazit
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!