Estou tentando criar um serviço systemd no Debian Jessie. Eu preciso que ele comece depois que network-online.target
for alcançado.
O problema é network-online.target
acionado ao mesmo tempo network.target
em que minhas interfaces ainda não estão configuradas, apenas iniciei a consulta DHCP.
Parece que esse problema é específico do Debian porque ele usa a configuração de rede herdada.
Como contornar este problema ou como tornar o network-online.target
trabalho?
debian
systemd
systemd-networkd
10robinho
fonte
fonte
systemctl list-dependencies network-online.target
? Além disso, observe que issonetwork-online.target
pode não ser necessário, significa que há acesso à Internet. Veja esta página para mais informações.network-online.target ● └─systemd-networkd-wait-online.service
eu já li essa página, entendo o conceito básico lá, mas ainda é muito estranho não ter um ponto definido em que os serviços críticos de rede possam iniciar. Pelo menos, poderia esperar pela atribuição adequada do DHCP.network-online.target
depende apenas dosystemd-networkd-wait-online.service
ditado de que está pronto. Não depende do NetworkManager dizer que está pronto, nem verificar seifup
todos os links foram exibidos com êxito (se você usar esse método para configurar sua rede). O Ubuntu, por outro lado, depende doifup
NetworkManager, mas não parasystemd-networkd-wait-online.
./etc/network/interfaces
:,.network
arquivos systemd ou NetworkManager?network-online.target
enetwork.target
é acionado logo depoisifup
. Eu uso o padrão debian, então/etc/network/interfaces
com o endereço dhcp. Parece que o networkd poderia ser uma solução melhor, mas não é fácil de implementar.Respostas:
Como você está usando
/etc/network/interfaces
, você precisará de um serviço systemd para monitorar o status de cada interface. Verifique se você possui/lib/systemd/system/ifup-wait-all-auto.service
(instalado peloifupdown
pacote no Ubuntu 15.04). Caso contrário, crie/etc/systemd/system/ifup-wait-all-auto.service
e cole o seguinte:Este é o arquivo de serviço presente em um sistema Ubuntu 15.04, mas com a
[Install]
seção adicionada para facilitar as coisas. Espero que o comportamento doifup
Ubuntu 15.04 seja o mesmo doifup
Debian Jessie. Caso contrário, algumas modificações serão necessárias (principalmente na última linha).Então corra
sudo systemctl enable ifup-wait-all-auto.service
. Depois de reiniciar o computador, você verá que o valornetwork-online.target
é alcançado após a abertura das interfaces (pelo menos).fonte
ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'
. Dependehostname
para verificar se o endereço IP foi atribuído.ifup-wait-all-auto.service
ele foi descartado naifupdown
versão0.8.5ubuntu1
: ”Solte ifup-wait-all-auto.service. Este foi implementado de forma mais elegante, fazendo Wants network-online.target = networking.service diretamente “. [Changelog ]Atenção! Acabei de descobrir isso em uma Jessie Raspbian: remova TODAS as linhas comentadas em / etc / network interfaces e funcionará! Parece ser um bug de análise =) No meu caso específico, deixei o comentário
iface eth0 inet dhcp
e esqueci-o há eras atrás, mas após a atualização para o Raspbian Jessie e a reconstrução de um kernel, tenho um comportamento muito estranho: ele usava o DHCP e se recusava a faça um ajuste em / etc / network / interfaces. Então, retirei todos os comentários - apenas linhas de trabalho, reinicialização - e funciona! NENHUM PATCHING / EDIÇÃO DE SCRIPT NECESSÁRIO!fonte
/etc/network/interfaces
arquivo - ele será acionado se ainda estiver lá.De acordo com https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/, a maneira recomendada de iniciar um serviço APÓS o nível da rede é usar " network-online.target " no arquivo .service :
No entanto, depois de usar " network-online.target " e meu serviço falhar porque a rede não estava totalmente nivelada, descobri que havia um bug ( https://github.com/coreos/bugs/issues/1966 ): não é garantido que seja 100% infalível.
De fato, onde ferramentas dinâmicas de configuração de rede, como o " NetworkManager ", são usadas como neste caso, o estado da rede nunca pode ser 100% preciso ou previsível. Aparentemente, no link que descreve o bug, " network-online.target " pode se comportar de maneira inconsistente, dependendo dos diferentes aplicativos com os quais é usado.
Solução alternativa :
você precisa analisar a ordem de inicialização dos serviços e usar uma que seja iniciada depois de " network-online.target ":
Esse é um processo iterativo que altera os destinos de forma incremental para serviços posteriores e posteriores até encontrar aquele que garante que a rede esteja nivelada e que o serviço inicie sem erros. No meu próprio caso, eu até precisei colocar
sleep 10
no meu script o serviço SystemD chamado.fonte
Certa vez, encontrei uma resposta no Github que a solucionava tentando continuamente executar ping em um servidor. Somente quando o ping é concluído, o serviço continua:
Substituí
google.com
pelo meu próprio servidor porque meu script principal precisava se conectar ao meu servidor.fonte