Systemd -Einheiten -Datei Erstellen eines Dienstes

Systemd -Einheiten -Datei Erstellen eines Dienstes
Service Management ist etwas, an das Sie nicht einmal denken, wenn Sie Ihre Linux -Workstation oder Ihren Linux -Server jeden Tag verwenden, aber wenn es nicht da ist, werden Sie es wirklich hassen. Wenn Sie beispielsweise ein neues Serverprogramm erstellen, das rund um die Uhr ausgeführt werden muss, ist diese Herausforderung ohne Serviceverwaltung ein Albtraum, in dem Sie tatsächlich selbst ein kleines Service -System erstellen, das offensichtlich nicht so gut ist wie der von einem entwickelte Manager Vollständiges Team in Jahren sowieso.

Mit seinen Diensten erleichtert Systemd das alles, wirklich einfacher, wirklich einfacher. Sobald Sie etwas über die Überwachung Ihrer Anwendung und die einfache Kontrolle darüber möchten, ist Systemd der richtige Weg, und genau das werde ich hier erklären!

Wo sind Systemd Services

Um einen neuen Service hinzuzufügen, müssen Sie diese Frage beantworten. Wie immer in systemd hängt es davon ab, ob der Dienst nur für Ihren Benutzer oder das gesamte System bestimmt ist. Wir werden uns darauf konzentrieren, wie Systemd für ganze Systemdienste funktioniert.

Der genaue Ort hängt davon ab, warum und wie der Dienst installiert wurde. Wenn der Dienst von einem Paketmanager installiert ist, wird er in der Regel in/usr/lib/systemd/system erfolgt. Für die Entwicklung von Software oder diejenigen, die Systemd nicht selbst unterstützen, setzen Sie die Servicedatei in/usr/local/lib/systemd/system ein. Bitte denken Sie jedoch daran, dass einige Verteilungen diesen Ordner in /usr /lokal nicht unterstützen. Wenn Sie schließlich einen vorhandenen Systemd -Service konfigurieren möchten, ist dies der richtige Weg, um zu gehen.

In diesen Ordnern finden Sie mehrere Dateierweiterungen wie *.Steckdose, *.Ziel oder *.Service. Offensichtlich werden wir uns auf den letzten konzentrieren. Systemd verwendet den Dateinamen als Name des Dienstes, wenn Sie ihn starten oder anhalten usw. Daher enthält Dateinamen im Dienst nur alphanumerische Zeichen zusammen mit Bindestrichen und Unterstrichen. Während der Entwicklung empfehle ich, es in Ihren Dokumenten zu erstellen und dann nach Abschluss an Systemd -Standort zu kopieren. Wenn Sie in der Mitte der Bearbeitung speichern.

OK, also erstellen Sie bitte Ihre Servicedatei in Ihren Dokumenten. Jetzt sind wir bereit zu überprüfen, wie man diese Datei schreibt.
[Hinweis: Siehe potenzielle Fehlerbericht im Kommentarbereich dieses Blog -Beitrags]

[Einheit]
Beschreibung = Penguins -Webanwendung HTTP -Server (ausgeführt in Port 8080)
Wantby by = multi-user.Ziel
[Service]
Typ = einfach
Execstart =/usr/bin/python3/usr/local/bin/penguin-web-App/Main.py
Neu starten = immer

Das Dateiformat ist in der Tat in der Nähe des INI. Ich weiß. Die Servicedatei ist zuerst in 2 Abschnitten geteilt: [Einheit] und [Service]. Jeder Abschnitt konfiguriert einen bestimmten Aspekt von SystemD: [Einheit] enthält Elemente, die von allen Systemd -Einheiten -Dateien gemeinsam genutzt werden, während [Service] nur für die Konfiguration spezifisch für die Einrichtung eines neuen Dienstes ist.

Dann ist der Abschnitt mit Eigenschaften wie Beschreibung = oder execStart = konfiguriert. Der Wert wird vom Eigenschaftsnamen durch das gleiche Zeichen = ohne Platz getrennt.

Kehren wir zu der oben gezeigten Datei zurück. Es beschreibt einen Dienst, der eine Web -App in Python über Penguine ausführen soll. Systemd startet es neu, wenn der Prozess beendet ist. Cool Eh?

Aber Sie sind vielleicht Ihre nächste Web -App nicht um Pinguine - Und das ist eine Schande - Und es ist nicht in Python geschrieben. In diesem Fall möchten Sie mehr über die möglichen Konfigurationen erfahren.

Eigenschaften von Systemd Services

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

Beschreibung = geht es nur darum, eine klare Beschreibung zu geben, was der Service tut. Es wird in der Serviceliste, in den Serviceprotokollen angezeigt, sodass es beschreibend ist, aber es sollte in einer Zeile und einem Satz bleiben.

ShodenBy = erlaubt zu systemd zu sagen: Wenn dieses Ding beginnt, startet mich auch. Im Allgemeinen werden Sie den Namen eines Ziels setzen. Beispiele für gemeinsame Ziele:

  1. Multi-Benutzer.Ziel: Wenn der Server in Ordnung ist und die Befehlszeilenanwendungen ausführen kann
  2. grafisch.Ziel: Wenn Gnome oder KDE fertig sind
  3. Netzwerk.Ziel: Wenn der Server ordnungsgemäß mit einem Netzwerk verbunden ist

OK für den Anfang ist diese Eigenschaften von [Einheit] ausreichend. Schauen wir uns jetzt [Service] an.

Type = hilft systemd dabei, zu wissen, ob ein Dienst ausgeführt wird. Hier sind gemeinsame Typen:

  1. Einfach ist wahrscheinlich die am häufigsten verwendete: Systemd berücksichtigt den Prozess, den Sie als den Dienst starten. Wenn der Prozess gestoppt wird, wird der Service auch gestoppt usw. berücksichtigt, usw.
  2. Die Gabelung wird für Anwendungen bevorzugt, die als Server geschrieben wurden, jedoch ohne die Hilfe eines Service -Management -Systems. Grundsätzlich erwartet es den gestarteten Prozess zur Gabel und diese Gabel gilt als endgültiger Prozess für den Service. Um genauer zu sein.

ExecStart = ist wahrscheinlich der wichtigste für einen Dienst. Wie Sie im Penguin -Service sehen können, habe ich/usr/bin/python3 und nicht sofort Python3 verwendet. Dies liegt daran, dass die Systemd -Dokumentation ausdrücklich empfiehlt.

Aber das ist auch aus einem anderen Grund. Das Managementsystem anderer Dienste basiert in der Regel auf Shell -Skripten. Wie auch immer, dass Systemd aus Leistungsgrund auch nicht standardmäßig eine Shell ausführt. Sie können also nicht direkt einen Shell -Befehl in execStart = angeben. Sie können jedoch ein Shell -Skript verwenden, indem Sie:

Execstart =/usr/bin/bash/usr/local/bin/stirp-penguin-server.Sch

Nicht so schwer richtig? Beachten Sie, dass ExecStop = existiert, wenn Sie einen Prozess ausführen müssen, um Ihren Dienst so zu signalisieren, dass Sie sauber gestoppt werden sollen.

Neustart = Ermöglicht Ihnen explizit mitzuteilen, wann der Dienst neu gestartet werden soll. Dies ist eine der wichtigsten Merkmale von SystemD: Sie stellt sicher, dass Ihr Service so lange aufbleibt, wie Sie möchten. Achten Sie also genau auf diese Option.

Neu starten = Bedeutung
stets Systemd startet es immer wieder neu, wenn es endet oder abstürzt. Nun, bis Sie SystemCtl Stop Service-Namen machen.Service.

Es ist perfekt für Server und Online -Dienste, da Sie nur wenige nutzlose Neustarts bevorzugen, wenn Sie den Service ohne Grund manuell neu starten müssen.

On-Aormal Starten Sie den Service neu, wenn der Serviceprozess abfällt. Wenn die Anwendung jedoch sauber ausgeht, starten Sie sie nicht neu.

Es ist nützlicher für Cron-Jobs wie Dienste, die eine zuverlässige Aufgabe erledigen müssen, aber nicht ständig ausführen müssen.

Ein-Failure Ähnlich wie vornormal, startet er aber auch den Service neu, wenn die Anwendung sauber, jedoch mit einem Exit-Code ungleich Null-Null ausgeht. Exit-Codes von ungleich Null bedeutet im Allgemeinen ein Fehler aufgetreten.
NEIN Systemd startet den Dienst nicht automatisch neu.

Im Allgemeinen nützlich, um Zugriff auf andere System -Funktionen wie Protokollierung ohne Neustartfunktion zu erhalten.

WorkingDirectory = kann ein Arbeitsverzeichnis beim Start Ihrer Bewerbung durchsetzen. Der Wert muss ein absoluter Verzeichnisweg sein. Arbeitsverzeichnis wird verwendet, wenn Sie relative Pfade im Code Ihrer Anwendung verwenden. Für unseren Penguins -Service könnte dies sein:

WorkingDirectory =/srv/penguin-Web-App/

Dann ist die Sicherheit wichtig, sodass Sie Ihren Service im Allgemeinen nicht mit Root -Privilegien starten möchten. Benutzer = und Group = ermöglicht es Ihnen, den Benutzer- oder Gruppennamen oder UID/GID festzulegen, unter dem Ihre Anwendung gestartet wird. Zum Beispiel:

Benutzer = Penguin-Web
Gruppe = Penguin-Web

Environmentfile = ist eine leistungsstarke Option. Als Dienste ausgeführte Anwendungen benötigen häufig Konfigurations- und Umgebungsdateien, ermöglicht diese Konfiguration auf zwei Arten:

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

Die Syntax dieser Datei ist einfach: Sie geben den Umgebungsvariablennamen, das Equal Sign = und dann ihren Wert ein. Dann setzen Sie den absoluten Weg Ihrer Umgebungsdatei in die Eigenschaft um Environmentfile ein.

Also Beispiel:

Environmentfile =/etc/penguin-Web-App/Umgebung

Und die Datei/etc/penguin-Web-App/Umgebungsdatei enthält:

Listen_port = 8080

Dann hat unsere Penguins -Web -App Zugriff auf die Umgebungsvariable der Hören_Port und hört den erwarteten Port an.

Speichern und starten Sie den neu erstellten SystemD -Dienst

Wenn Sie also meinen Rat befolgt haben, haben Sie Ihre Servicedatei in Ihrem Heimverzeichnis bearbeitet. Sobald Sie zufrieden sind, kopieren Sie diese Datei in/usr/local/lib/systemd/system unter der Annahme, dass Ihre Verteilung diesen Pfad unterstützt. Der Dateiname Ihrer Servicedatei ist der Servicename. Dieser Dateiname muss mit enden .Service. Zum Beispiel für unseren Penguins-Server wäre es Penguin-Web-App.Service.

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

$ sudo systemctl Daemon-Reload

Okay, jetzt ist sich SystemD Ihres neuen Dienstes bewusst, vorausgesetzt, Ihre Datei enthält keinen Syntaxfehler. Immerhin ist es Ihre erste Datei, daher werden Sie wahrscheinlich Fehler machen. Sie müssen diesen Befehl oben in jedem Update in Ihrer Servicedatei ausführen.

Jetzt Zeit, den Service zu starten:

$ sudo systemctl starten penguin-web-app.Service

Wenn es mit einem Gerät, nicht gefunden wurde, fehlschlägt ein Fehler wie diesen:

$ sudo systemctl starten penguin-web-app.Service
Penguin-Web-App nicht starten.Service: Einheit nicht gefunden.

Dies bedeutet, dass Ihre Verteilung das Verzeichnis nicht unterstützt oder Sie Ihre Servicedatei nicht korrekt benannt haben. Achten Sie darauf, sich anzusehen.

Wenn Sie Ihren Service mit shodenBy = einrichten und möchten, dass Ihr Service automatisch beginnt, müssen Sie ihn mit diesem Befehl aktivieren:

$ sudo systemctl aktivieren penguin-web-app.Service

Das Coole mit einem Service ist, dass es im Hintergrund läuft. Das Problem: Wie man weiß, ob es richtig ausgeführt wird und ob es ausgeführt wird, wenn es im Hintergrund läuft? Mach dir keine Sorgen, das Systemd -Team hat auch darüber nachgedacht und einen Befehl gegeben, um zu sehen, ob es richtig ausgeführt wird, da wie viel Zeit usw.:

$ systemctl Status penguin-Web-App.Service

Abschluss

Herzlichen Glückwunsch! Sie können jetzt Ihre Bewerbungen verwalten lassen, ohne dass Sie sich jedes Mal um manuelles Neustart kümmern. Jetzt empfehle ich Ihnen, unseren anderen Artikel über Systemd -Protokolle zu lesen: Master JournalCTL: Verstehe Systemd -Protokolle. Damit können Sie das leistungsstarke Protokollierungssystem für Ihren neuen Service verwenden und zuverlässigere Server erstellen!