Escrevi alguns arquivos de serviço do usuário systemd que eu quero que os usuários ativem e que precisam de uma conexão de rede em funcionamento. Eu pensei que seria tão fácil quanto:
Wants=network-online.target
After=network-online.target
No entanto, os serviços parecem começar muito cedo, e journalctl
vejo:
network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.
Então eu procurei mais e tentei
Wants=network.target
After=network.target
e fez sudo systemctl enable systemd-networkd-wait-online.service
.
Agora eu tenho em journalctl
:
network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.
E, novamente, o serviço começa muito cedo.
Essa mensagem deveria estar lá? Como posso depurar meu problema?
EDIT : o motivo é simples e especificamente indicado no Arch Wiki :
systemd --user
é executado como um processo separado dosystemd --system
processo. As unidades do usuário não podem fazer referência ou depender das unidades do sistema.
Esta postagem no fórum parece sugerir uma solução simples: eu devo link
a unidade de sistema necessária como usuário, criando assim um link simbólico para ela disponível no caminho de pesquisa da unidade.
Depois disso, não vejo nenhuma No such file or directory
mensagem; no entanto, ainda não consigo executar os serviços após a rede estar online. Eu tentei ligar network.target
, network-online.target
e systemd-networkd-wait-online.service
, colocando minhas unidades de depender de cada um deles, sem sucesso. Quando verifico o status da unidade vinculada no modo de usuário, todas elas estão mortas, por exemplo:
$ systemctl --user status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.
No entanto, posso ver network-online.target
ativo no modo de usuário depois de vinculá-lo:
$ systemctl --user status network-online.target
● network-online.target - Network is Online
Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
Docs: man:systemd.special(7)
http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.
fonte
Respostas:
Como você não pode depender de um serviço do sistema, sua única solução é fornecer um serviço ao usuário que detecte se a rede está online. (Ou faça os serviços do sistema de serviços.) Os detalhes de um serviço de usuário "detect-online" dependeriam da sua definição de "online". Pode esperar um ping para 8.8.8.8, por exemplo. Ou para que uma resolução de nomes DNS seja bem-sucedida. Por exemplo, em uma situação semelhante ao vpnc, espero que um ping em um IP vpn seja bem-sucedido.
Em seguida, você pode fazer com que seus serviços de usuário dependam (após =) do serviço de usuário online de detecção.
fonte
Eu recomendaria testar algo como isto:
Seguido por:
fonte