Ich habe die Manpage zum systemd-Dienst ein paar Mal gelesen, kann aber immer noch kein grundlegendes systemd-Muster herausfinden:
Ich möchte einen einmaligen Startvorgang (wie einen Docker-Container oder das Formatieren eines Laufwerks) beim Booten erfolgreich abschließen. Wenn ich dafür jedoch Type = oneshot verwende, kann ich Restart = on-failure nicht verwenden. Wenn dies fehlschlägt, wird der Auftrag nicht wiederholt. Vermisse ich hier etwas Offensichtliches?
Ich habe auch versucht, Type = simple mit Restart = on-failure zu setzen, aber in vielen Fällen brauche ich das folgende Verhalten (von der Manpage), das die OneShot-Dienste liefern:
Das Verhalten von oneshot ist ähnlich einfach; Es wird jedoch erwartet, dass der Prozess beendet werden muss, bevor systemd Nachfolgeeinheiten startet.
Aktualisierung:
Restart
und Umbrechen vonmy_cmd
:ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
zusammen mit einem angemessenenTimeoutStartSec
Wert.Restart=
durch EinstellenFailureAction=[self.unit]
(ersetzen Sie [self.unit] durch den Namen des Geräts). Es ist irgendwie abgedreht, aber zumindest explizit und leicht zu befolgen.FailureAction
nimmt die gleichen Werte an wieStartLimitAction
und alle außernone
lösen eine Art Herunterfahren aus.Antworten:
Eine mögliche Problemumgehung, die ich versuche, ist
Wo der Skript
tag.sh
Willentouch /ack/TAG_SUCCESS
am Ende der Ausführung. Ich glaube, dass dies dem gewünschten Verhalten ziemlich nahe kommt, daExecStartPre
es nacheinander ausgeführt wird und auf den erfolgreichen Abschluss wartet, bevor der Aufruf erfolgt.ExecStart
Das Gerät wird nur dann berücksichtigt,Starting
wenn derExecStart
Aufruf zu dem Zeitpunkt erfolgt ist, zu dem wir sicher sind, dass wir die Startaufgabe abgeschlossen haben.Aber das fühlt sich immer noch wie ein riesiger Hack an?
quelle
RemainAfterExit=yes
, dass die Einheit "aktiv" bleibt, damit andere Einheiten davon abhängen können.