Systemd: Como garantir que um serviço “oneshot” seja tentado novamente se falhar na primeira vez?

11

Eu li o manpage do serviço systemd algumas vezes, mas ainda não consigo descobrir um padrão básico do systemd:

Eu quero executar um processo de inicialização uma vez (como um contêiner do Docker ou formatar uma unidade) na inicialização, com êxito até a conclusão. Mas se eu usar Type = oneshot para isso, não será possível usar Restart = on-failure e, se falhar, não tentarei novamente o trabalho. Estou faltando algo óbvio aqui?

Eu também tentei definir Type = simple com Restart = on-failure, mas em muitos casos eu preciso do seguinte comportamento (da página de manual) que os serviços individuais fornecem:

Behavior of oneshot is similar to simple; however, it is expected that the process has to exit before systemd starts follow-up units.

Atualizações:

por JKnight 26.03.2016 / 15:44

1 resposta

2

Uma solução possível que estou tentando é

  [Unit]
    Description=Tags instance and EBS vols
    After=docker.service
    Requires=docker.service

    [Service]
    ExecStartPre=/usr/bin/docker run --rm -v /opt/tag.sh:/tag.sh -v /opt:/ack --entrypoint=/bin/sh alpine /tag.sh
    ExecStartPre=/usr/bin/sh -c '[[ -e /opt/TAG_SUCCESS ]]'
    ExecStart=/usr/bin/rm /opt/TAG_SUCCESS
    Restart=on-failure
    RestartSec=30

Onde o script tag.sh irá touch /ack/TAG_SUCCESS no final da execução. Acredito que isso fique muito próximo do comportamento desejado porque ExecStartPre será executado sequencialmente, aguardando a conclusão bem-sucedida antes de chamar ExecStart e a unidade só é considerada Starting once ExecStart é chamado. Concluímos a tarefa de inicialização.

Mas isso ainda parece um hack gigante?

    
por 28.03.2016 / 17:38

Tags