Forking in einem systemd-Skript

10

Ich möchte, dass der systemd-Dienst das Forking handhabt (meine Datei handhabt das Forking nicht selbst. Daher verlasse ich mich auf systemd, um das zu handhaben).

Meine .service-Datei:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

Frage

Type=forkingReicht die Angabe für das, was ich erreichen möchte, aus? Oder ist es ähnlich zu erwarten, dass das Forking beim Upstart tatsächlich den Upstart mitteilt (wenn ich das richtig verstehe, bin ich mir nicht sicher, ob ich Initscripts schreibe), dass mein Dienst das Forking / Daemonizing übernehmen würde.

Alonisser
quelle

Antworten:

16

systemd verfügt über eine hervorragende Dokumentation. Siehe die Seite über Servicedateien :

Wenn diese Option auf Forking gesetzt ist, wird erwartet, dass der mit ExecStart = konfigurierte Prozess im Rahmen seines Startvorgangs fork () aufruft. Es wird erwartet, dass der übergeordnete Prozess beendet wird, wenn der Start abgeschlossen ist und alle Kommunikationskanäle eingerichtet sind. Das untergeordnete Element wird weiterhin als Hauptdämonprozess ausgeführt. Dies ist das Verhalten traditioneller UNIX-Daemons. Wenn diese Einstellung verwendet wird, wird empfohlen, auch die Option PIDFile = zu verwenden, damit systemd den Hauptprozess des Dämons identifizieren kann. systemd fährt mit dem Starten der Folgeeinheiten fort, sobald der übergeordnete Prozess beendet wird.

Wenn Sie dies verwenden, typewird systemd lediglich angewiesen, auf die swampRückgabe zu warten und dann davon auszugehen, dass es noch ausgeführt wird: Es liegt in Ihrer Verantwortung, dies zu tun ...

Jasonwryan
quelle
5
Wenn das Skript keine Verzweigung ausführt, ist es entweder oneshot(ein typisches Skript mit kurzer Laufzeit) oder simple(ein Dienst mit langer Laufzeit, der nicht verzweigt + beendet).
Pavel Šimerda
4
Würden Sie ein Skript (Bash?) In Betracht ziehen, um einen anderen Prozess zu verzweigen, wenn im Hintergrund kaufmännisches Und verwendet wird &?
Felipe Alvarez
5
@FelipeAlvarez Ja, der kaufmännische Und-Operator in bash entspricht einem Fork und Exec.
Thayne
1

Wenn systemd mit dem Gabeln umgehen soll, sollten Sie zB Type=simpleoder verwenden Type=notify. Dann erledigt systemd das Gabeln für Sie.

Wenn Sie die swampausführbare Datei ändern können , Type=notifyist dies die beste Lösung. Die ausführbare Datei sollte dann systemd benachrichtigen, wenn sie erfolgreich initialisiert wurde. Dies bedeutet, dass Sie systemctl start swampauf die Initialisierung von swamp warten müssen, wenn Sie über die Befehlszeile aufgerufen werden, und alle Fehlermeldungen drucken, während Sie über die Befehlszeile initialisieren, was normalerweise der Fall ist.

Ein Beispiel für eine ausführbare Datei, die für die Verwendung von Type = notify geschrieben wurde, finden Sie im folgenden Shellscript:

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
user3049102
quelle