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!
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]
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:
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:
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:
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
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!