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 systemctl reload MYSERVICE
sollte der Prozess abgebrochen und neu gestartet werden.
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
Als Ergebnis start
und restart
Arbeit, aber reload
gibt diesen Fehler:
# 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?
Antworten:
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.
Stattdessen sollten Sie verwenden,
systemctl reload-or-restart
die ein Neuladen durchführen, falls vorhanden, und einen Neustart, falls dies nicht der Fall ist.Von der Manpage ...
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 einen Weg zum Beenden und Neustarten des Dienstes zu definieren, hat er eine neue PID und systemd wäre verwirrt.
quelle
Die Philosophie
reload
von systemd ist, dass dies optional ist und der Benutzer von systemd für jeden Dienst wissen sollte, ob er ihn aufrufenreload
oder durch Aufrufen vortäuschen sollrestart
.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 Neuladefunktion unterstützt ... dh ein Neuladen, das den Dienst nicht beendet und neu startet oder dessen Dienst seine PID ändert. 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" Nachladen implementieren könnte, indem ich zulasse, dass
ExecReload
der Dienst beendet und neu gestartet wird? Dann könnte ichsystemctl reload FOO
alle meine Dienste nutzen und müsste mich nicht daran erinnern, welche es unterstützen und welche nicht?Ja, das wäre einfacher, aber das wäre nicht systemd. Systemd möchte, dass der Anrufer weiß, ob er
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 geht Puppet davon aus, dass ein systemgesteuerter Dienst keine hat,
reload
und beendet standardmäßig den Prozess und beendet ihn neu . Wenn der Typ Service [] eine Möglichkeit hinzugefügt hat, anzugeben, dass ein erneutes Laden 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, allmontierende System zu sein, das alle Namespaces anpasst und alles auf meiner Ebene anpasst. 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.)quelle
systemctl reload-or-restart
, der den Dienst neu lädt, wenn er ihn unterstützt, und ihn neu startet, wenn dies nicht der Fall ist. Keine Ahnung, warum Puppet diese Annahme macht.