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