Przeczytałem kilka razy stronę systemową usługi, ale nadal nie mogę znaleźć podstawowego wzorca systemowego:
Chcę raz uruchomić proces uruchamiania (np. Kontener Dockera lub sformatować dysk) przy starcie systemu, aby zakończyć. Ale jeśli użyję do tego Type = oneshot, to nie będę mógł użyć Restart = w przypadku awarii, a jeśli się nie powiedzie, to nie spróbuje ponownie wykonać zadania. Czy brakuje mi czegoś oczywistego?
Próbowałem także ustawić Type = simple z Restart = w razie awarii, ale w wielu przypadkach potrzebuję następującego zachowania (z strony podręcznika), które dają usługi oneshot:
Zachowanie oneshota jest podobne do prostego; oczekuje się jednak, że proces musi zakończyć się, zanim systemd rozpocznie jednostki kontrolne.
Aktualizacje:
Restart
i zawinięcie wmy_cmd
ten sposób:ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
wraz z pewną rozsądnąTimeoutStartSec
wartością.Restart=
przez ustawienieFailureAction=[self.unit]
(zamień [self.unit] na nazwę urządzenia). To trochę hacky, ale przynajmniej wyraźne i wystarczająco łatwe do naśladowania.FailureAction
przyjmuje te same wartości, coStartLimitAction
wszystkie, z wyjątkiemnone
pewnego rodzaju wyłączenia.Odpowiedzi:
Jednym z możliwych obejść, których próbuję, jest
Gdzie skrypt
tag.sh
będzietouch /ack/TAG_SUCCESS
pod koniec wykonywania. Uważam, że zbliża się to do pożądanego zachowania, ponieważExecStartPre
zostanie wykonane sekwencyjnie, czekając na pomyślne zakończenie przed wywołaniem,ExecStart
a jednostka jest rozpatrywana tylkoStarting
raz, gdyExecStart
zostanie wywołana, w którym momencie jesteśmy pewni, że zakończyliśmy zadanie uruchamiania.Ale nadal wydaje się to gigantycznym hackem?
źródło
RemainAfterExit=yes
Działa to dla mnie dobrze, tyle że musiałem również ustawić, aby jednostka pozostała „aktywna”, aby inne jednostki mogły na niej polegać.