Hinzufügen einer Verzögerung zwischen Stopp und Start eines Prozesses in systemd


10

Ich habe ein wirklich seltsames Problem mit systemd. Wenn ich a ausstelle systemctl restart, wird der neue Prozess gestartet, bevor der vorherige abgeschlossen ist.

Dies ist im Protokoll zu sehen, in dem die letzte Meldung zum Herunterfahren ("Protokoll schließen") nach der Startmeldung ("Protokoll öffnen") protokolliert wird.

Gibt es eine Möglichkeit, eine Verzögerung zwischen dem Stopp und dem Start des Prozesses hinzuzufügen?


Nichts systemctl stop myservice && sleep 3 && systemctl start myservice
hindert

Warum ist das seltsam? Es ist ein Designmerkmal, das Sie in Ruhe lässt, um Probleme der realen Welt zu lösen. Injizieren Sie den Ruhezustand in Ihren Unit-Start oder verwenden Sie eine ExecPre-Bedingung, um sicherzustellen, dass die alte Instanz vollständig verschwunden ist.
Florian Heigl

Antworten:


12

In Ihren systemd-Dienstdateien können Sie die Option RestartSec festlegen, um eine Verzögerung für den Neustart hinzuzufügen. Siehe Beispiel unten:

[Service]
Restart=always
RestartSec=30

Überprüfen Sie diesen Link für weitere Beispiele.


1
afaik RestartSecgilt nur für Dienste, die mit der Restart=Richtlinie konfiguriert wurden, und wird bei der Ausführung von asystemctl restart someservice
don_crissti

1

RestartSec scheint nur verwendet zu werden, wenn dieser bestimmte Dienst über den Befehl systemctl restart neu gestartet wird.

Zum Beispiel habe ich zwei Dienste, A und B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

und

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Wenn Sie einen Systemctl-Neustart B durchführen, funktioniert dies wie erwartet. Wenn Sie jedoch einen Systemctl-Neustart A durchführen, werden beide Dienste ohne Verzögerung gestoppt und sofort wieder gestartet.

Systemd verwendet anscheinend nur die Konfigurationswerte für den von Ihnen angegebenen Dienst und ignoriert sie für alle Abhängigkeiten.

Dies ist nicht so ungewöhnlich, wie es sich anhört. Wenn B mit einem Remote-Server kommuniziert, kann das schnelle Starten und Stoppen fehlschlagen, da das Remote-Ende den Client ablehnt. Ein direkter Neustart von A erfolgt jedoch immer dann, wenn A ohne Änderung von B aktualisiert wird.

Sie können dies wahrscheinlich umgehen, indem Sie die Verzögerung auch zu A hinzufügen. Sie sollten dies jedoch nicht MÜSSEN, da dies die Objektisolation unterbricht, indem Sie A über B informieren, wenn es sich nicht um eine Abhängigkeit handelt.

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.