it-swarm.com.de

Wie kann ich einen systemd-Dienst so konfigurieren, dass er regelmäßig neu gestartet wird?

Ich habe einen einfachen systemd-Dienst, der regelmäßig neu gestartet werden muss, um zu verhindern, dass sein Prozess fehlerhaft wird. Gibt es eine Konfigurationsoption für systemd-Dienste, um sie regelmäßig neu zu starten? Alle der Restart* options bezieht sich anscheinend auf den Neustart des Dienstes, wenn dieser beendet wird.

37
wes

Ja, Sie können Ihren Dienst so einrichten, dass er regelmäßig neu gestartet wird, indem Sie Ihren Dienst auf Type=notify Setzen. Fügen Sie diese Option im Abschnitt [Service] Ihrer Servicedatei zusammen mit Restart=always Hinzu und geben Sie WatchdogSec=xx Ein, wobei xx der Zeitraum in Sekunden ist, in dem Sie Ihren Service neu starten möchten. Hier wird Ihr Prozess nach xx Zeitspanne von systemd abgebrochen und von systemd erneut gestartet. für zB.

[Unit]
.
.

[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.

[Install]
WantedBy= ....
31
Saturn

Möglicherweise war dies zu dem Zeitpunkt, als die Frage gestellt wurde, noch nicht vorhanden, aber es gibt jetzt eine Option mit dem Namen RuntimeMaxSec , die den Dienst beendet, nachdem er für den angegebenen Zeitraum ausgeführt wurde .

z.B.

[Service]
Restart=always
RuntimeMaxSec=604800

Für mich ist das eleganter, als Type=notify Und WatchdogSec zu missbrauchen.

49
Alex Forbes

Ich sah eine Lösung hier die elegant wirkte, wenn auch ein bisschen umständlich. Die Schlüsselidee besteht darin, einen One-Shot-Dienst zu erstellen, der von einem Timer ausgelöst wird, der den Dienst neu startet ein anderer.

Für den Timer:

[Unit]
Description=Do something daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Für den One-Shot-Service:

[Unit]
Description=Restart service

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service

Für den One-Shot-Service unter Ubuntu 16.04 LTS:

[Unit]
Description=Restart service

[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service

Mit dieser Lösung können Sie die Zeitgeber von systemd nutzen, einschließlich der Möglichkeit, den Dienst zu einer bestimmten Tageszeit und nicht erst nach Ablauf einer bestimmten Zeitspanne neu zu starten.

29
matmat

Wie wäre es mit einem Crontab wie

30 3 * * Sun /bin/systemctl restart yourService

dies würde den Dienst yourService jeden Sonntag um 3.30 Uhr neu starten.

13
Fritz Zaucker

Nur einige alternative Ansätze, um letztendlich dasselbe Ziel zu erreichen:

  • wenn Sie die Kontrolle über die Service-Implementierung haben, können Sie diese nach einer Weile freiwillig beenden, z. B. durch einfaches Beenden nach einer bestimmten Anzahl von Iterationen (falls zutreffend) oder durch Verwendung eines Timeout-Timers mit einem Handler, der sich selbst ein SIGTERM/SIGKILL sendet
  • wenn die Beendigung des Freiwilligendienstes nicht machbar/praktisch ist, können Sie ein kleines Cron-basiertes Skript haben, das den/die Dienstprozess (e) abbricht.
3
Dan Cornilescu

Wollte das kommentieren

[Service]
Restart=always
RuntimeMaxSec=604800

antwort oben, aber ohne weitere Punkte.

Diese Lösung ruft die Fehlerbehandlung auf, die von OnFailure=failure_handling.service. Da der geplante Neustart kein echter Fehler ist, sind Protokollierungen, Benachrichtigungen usw. vom Fehlerbehandlungsdienst unerwünscht und möglicherweise störend.

Ein regelmäßiger Neustart wäre für systemd eine sinnvolle Funktion, aber ich werde nicht den Atem anhalten.

2
E Gow