Eu li a página de manual do serviço systemd algumas vezes, mas ainda não consigo descobrir um padrão básico do systemd:
Desejo executar um processo de inicialização uma vez (como um contêiner de docker ou formatar uma unidade) na inicialização, com êxito até a conclusão. Mas se eu usar Type = oneshot para isso, não posso usar Restart = on-fail e, se falhar, não tentará novamente o trabalho. Estou perdendo algo óbvio aqui?
Eu também tentei definir Type = simple com Restart = on-fail, mas isso em muitos casos eu preciso do seguinte comportamento (da página de manual) que os serviços oneshot oferecem:
O comportamento do oneshot é semelhante ao simples; no entanto, espera-se que o processo precise sair antes que o systemd inicie as unidades de acompanhamento.
Atualizações:
Restart
e agruparmy_cmd
desta forma:ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
junto com algumTimeoutStartSec
valor razoável .Restart=
configuraçãoFailureAction=[self.unit]
(substitua [self.unit] pelo nome da unidade). É meio hacky, mas pelo menos explícito e fácil de seguir.FailureAction
aceita os mesmos valores queStartLimitAction
, e todos, excetonone
acionar um desligamento de algum tipo.Respostas:
Uma possível solução alternativa que estou tentando é
Onde o script
tag.sh
estarátouch /ack/TAG_SUCCESS
no final da execução. Acredito que isso se aproxime bastante do comportamento desejado, porqueExecStartPre
será executado sequencialmente, aguardando a conclusão bem-sucedida antes da chamadaExecStart
e a unidade será considerada apenas umaStarting
vez queExecStart
for chamada e nesse ponto, temos certeza de que concluímos a tarefa de inicialização.Mas isso ainda parece um hack gigante?
fonte
RemainAfterExit=yes
para que a unidade permanecesse "ativa" para que outras unidades pudessem depender dela.