it-swarm.com.de

Wie konfiguriere ich systemd, um einen Daemon beim Neuladen zu beenden und neu zu starten?

Ich habe einen Old-School-Daemon, den ich mit systemd steuern möchte. Wenn sich die Konfigurationsdatei ändert, muss sie beendet und neu gestartet werden. Mit anderen Worten, nach dem Bearbeiten der Konfigurationsdatei wird systemctl reload MYSERVICE sollte den Prozess abbrechen und neu starten.

Versuch 1: Probieren Sie die Standardeinstellungen aus. Dies teilt systemd mit, wie der Dämon gestartet werden soll, nicht jedoch, wie er neu geladen werden soll.

[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple

Infolgedessen funktionieren start und restart, aber reload gibt diesen Fehler aus:

# systemctl reload MYSERVICE
Failed to reload MYSERVICE.service: Job type reload is not applicable for unit MYSERVICE.service.

Versuch 2: Sagen Sie, wie der Prozess abgebrochen werden soll. Dies beendet den Prozess, aber systemd startet ihn für mich nicht neu.

[Service]
ExecStart=/usr/bin/MYSERVICE
Type=simple
ExecReload=/bin/kill -HUP $MAINPID

...gefolgt von...

# systemctl daemon-reload
# systemctl reload MYSERVICE

... beendet den Prozess, wird jedoch nicht automatisch neu gestartet.

Versuch 3: Verwenden Sie ExecReload, um den Prozess ebenfalls neu zu starten. Dies schlägt aus mehreren Gründen fehl:

ExecReload=/bin/kill -HUP $MAINPID ; /usr/bin/MYSERVICE

... die Fehlermeldung, die ich bekomme ...:

# systemctl daemon-reload
# systemctl reload MYSERVICE
Job for MYSERVICE.service failed because the control process exited with error code. See "systemctl status MYSERVICE.service" and "journalctl -xe" for details.

Ich würde erwarten, dass es einen ReloadType = kill_and_restart gibt oder so, aber kein solches Glück.

Wie kann man systemd anweisen, einen Daemon beim Neuladen zu töten und neu zu starten?

12
TomOnTime

Die Antwort lautet: "Du nicht"! Aber wir haben gute Nachrichten.

die Philosophie von systemd ist, dass das Neuladen optional ist und undefiniert bleiben sollte, wenn es keine echte Neuladefunktion gibt. Ich würde "echte Neuladefunktionalität" als ein Neuladen definieren, das den Dienst nicht beendet und nicht neu startet oder die PID des Dienstes ändert. Mit anderen Worten, systemd möchte nur widerspiegeln, welche Funktionen vorhanden sind.

Verwenden Sie stattdessen systemctl reload-or-restart, Das ein erneutes Laden durchführt, falls vorhanden, und einen Neustart, falls dies nicht der Fall ist.

Von der Manpage ...

   reload-or-restart PATTERN...
       Reload one or more units if they support it. If not, restart them
       instead. If the units are not running yet, they will be started.

   reload-or-try-restart PATTERN...
       Reload one or more units if they support it. If not, restart them
       instead. This does nothing if the units are not running. Note that,
       for compatibility with SysV init scripts, force-reload is
       equivalent to this command.

Deshalb: (1) Lassen Sie ExecReload leer, (2) verwenden Sie systemctl reload-or-restart MYSERVICE Und (3) Sie sollten alle eingestellt sein.

Wenn Sie versuchen, ExecReload zu verwenden, um eine Möglichkeit zum Beenden und Neustarten des Dienstes zu definieren, hat er eine neue PID und systemd wäre verwirrt.

16
TomOnTime

die Philosophie von systemd ist, dass reload optional ist und der Benutzer von systemd für jeden Dienst wissen sollte, ob er reload aufrufen oder durch Aufrufen von restart fälschen soll.

Daher lautet die Antwort auf Ihre Frage: "Es funktioniert nicht und sollte es auch nicht. Bitte lösen Sie dies auf der nächsthöheren Ebene."

Mit anderen Worten, systemd möchte, dass Sie " reload " nur implementieren, wenn der zugrunde liegende Dienst eine echte Reload-Funktionalität unterstützt ... dh ein Reload, das nicht beendet wird und starten Sie den Dienst neu, oder ändern Sie die PID des Dienstes. Mit anderen Worten, systemd möchte nur widerspiegeln, welche Funktionen vorhanden sind.

Sie fragen sich vielleicht: Aber wäre es nicht einfacher, wenn ich ein "falsches" Neuladen implementieren könnte, indem ich ExecReload erlaube, den Dienst zu beenden und neu zu starten? Dann könnte ich systemctl reload FOO für alle meine Dienste und ich müsste mich nicht erinnern, welche es unterstützen und welche nicht?

Ja, das wäre einfacher, aber das wäre nicht systemd. Systemd möchte, dass der Aufrufer weiß, ob reload für den Dienst vorhanden ist. Systemd möchte eine gemeinsame Schnittstelle zu den vorhandenen Funktionen sein und nicht dafür verantwortlich sein, die Lücken zu schließen.

Zum Beispiel nimmt Puppet an, dass ein systemgesteuerter Dienst kein reload hat und standardmäßig den Prozess beendet und neu startet . Wenn der Typ Service [] eine Möglichkeit hinzugefügt hat, anzugeben, dass ein Neuladen vorhanden ist und dass er bei einer Benachrichtigung verwendet werden soll, muss er erfahren, welche Dienste über ein natives Neuladen verfügen oder nicht. Chefkoch und alle anderen Systeme müssten dasselbe lernen, weil systemd möchte, dass es auf dieser Ebene gelöst wird. (MiniRant: Zum Starten eines Prozesses scheint systemd das allwissende, alles montierende, alle Namespace-anpassende i-do-alles-auf-meiner-Schicht-System zu sein. Daher kann ich Ihnen nicht sagen, warum dies nicht der Fall ist Erweitern Sie diese Philosophie auf das Nachladen. Vielleicht kann sich einer der Autoren hier einschalten.)

3
TomOnTime