Я прочитал man-страницу службы systemd несколько раз, но все еще не могу понять базовый шаблон systemd:
Я хочу запустить процесс запуска один раз (например, Docker-контейнер или отформатировать диск) при загрузке, успешно до завершения. Но если я использую Type = oneshot для этого, то я не могу использовать Restart = on-fail, и если он потерпит неудачу, он не будет повторять работу. Я что-то упускаю здесь очевидное?
Я также попытался установить Type = simple с Restart = on-fail, но во многих случаях мне нужно следующее поведение (из man-страницы), которое предоставляют службы oneshot:
Поведение одних рук похоже на простое; однако ожидается, что процесс должен завершиться до того, как systemd запустит последующие блоки.
Обновления:
Restart=
при настройке FailureAction=[self.unit]
(замените [self.unit] на имя устройства). Это вроде хакерский, но, по крайней мере, явно и достаточно легко следовать.
FailureAction
принимает те же значения StartLimitAction
, что и все, кроме none
запуска отключения какого-либо рода.
Restart
и обернутьmy_cmd
так:ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
вместе с некоторым разумнымTimeoutStartSec
значением.