Por que meu serviço systemd não está esperando pela rede?

7

Por esta pergunta e sua respostas, adicionei o seguinte ao meu arquivo de serviço:

Wants=network-online.target
After=docker.service network.target network-online.target

Eu também corri:

systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service

No entanto, minha tarefa ExecStartPre , que usa git pull origin master , ainda falha devido ao que parece ser um problema de conectividade.

Mar 22 16:17:21 COMPUTER git[1983]: ssh: Could not resolve hostname github.com: Name or service not known
Mar 22 16:17:21 COMPUTER git[1983]: fatal: Could not read from remote repository.

Estou sentindo falta de algo óbvio? Existe outro serviço para o qual preciso aguardar para usar git pull ? (Caso seja relevante, estou usando o Ubuntu 16.10 e o systemd 231.)

    
por pdoherty926 22.03.2017 / 21:24

1 resposta

3

O primeiro passo é determinar se você está usando NetworkManager ou systemd-networkd . Ative wait-online para o que você está usando (assumindo systemd-networkd para este exemplo):

systemctl enable systemd-networkd-wait-online.service

Ter seu serviço iniciado após o wait-online service:

[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service

(requer uma variante mais estrita de wants , neste caso parece que você quer a dependência difícil).

Isso deve fazer com que seu serviço seja iniciado depois que a rede estiver garantida.

Como alternativa (ou em conjunto com a solução anterior), você pode configurar o serviço para ser reiniciado quando falhar usando o sinalizador Restart= :

[Unit]
...
Restart=on-failure
RestartSec=5

link

Esse pode ser o melhor método, porque não vai diminuir sua inicialização ( link - usar wait-online é susceptível de retardar consideravelmente o seu tempo de arranque), mas se estiver preocupado com o que o serviço pode fazer quando falhar, escolha a opção 1 ou ambas.

    
por 05.04.2017 / 20:40