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


12

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 MYSERVICEsollte 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 startund restartArbeit, aber reloadgibt 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?


Muss das wirklich zum Nachladen gebracht werden , wo es nicht ganz genau passt? Können Sie den Dämon nicht dazu bringen, sich vernünftig zu verhalten?
Michael Hampton

Danke @MichaelHampton, aber dies ist keine Situation, in der ich das Programm umschreiben kann. Ich freue mich über Ihren hilfreichen Vorschlag. Ich bin mir jedoch sicher, dass dies ein gängiger Systemanwendungsfall ist und eine kanonische Antwort vielen Menschen helfen könnte.
TomOnTime

1
Ich bin mir sicher, dass eine Antwort jemandem helfen könnte, also habe ich die Frage positiv bewertet. Ich bin mir nur nicht sicher, ob dies ein häufiger Anwendungsfall ist. Nachdem ich systemd ungefähr fünf Jahre lang verwendet habe, fast von dem Tag an, an dem es auf die Welt losgelassen wurde, kann ich mich zum ersten Mal daran erinnern, von jemandem gehört zu haben, der ein solches Szenario versucht. Es ist möglich, dass ich etwas falsch verstehe, weil Details fehlen.
Michael Hampton

Antworten:


16

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-restartdie ein Neuladen durchführen, 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 MYSERVICEund (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.


3

Die Philosophie reloadvon systemd ist, dass dies optional ist und der Benutzer von systemd für jeden Dienst wissen sollte, ob er ihn aufrufen reloadoder durch Aufrufen vortäuschen soll restart.

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 ExecReloadder Dienst beendet und neu gestartet wird? Dann könnte ich systemctl reload FOOalle 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 reloadfü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, reloadund 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.)


1
Es gibt einen 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.
Michael Hampton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.