Systemd: como fazer um serviço systemd iniciar após a rede estar totalmente conectada?

Systemd: como fazer um serviço systemd iniciar após a rede estar totalmente conectada?

Fundo

Estou escrevendo um script simples para ser executado no Raspbain no Raspberry Pi 2, basta acender um LED para indicar que estou pronto para conectar-me ao SSH do meu computador desktop.

O script não é importante aqui, apenas para mencionar que como eu uso controle de frequência então o script fica rodando um loop infinito, para ligar e desligar o LED com frequência. Portanto, este é um exemplo de serviço simples. No entanto, pelo menosa resposta aceita desta perguntaaconselhe-me a definir o tipo como inativo. Então meu arquivo de serviço se parece

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

Efeito

O serviço funciona conforme o esperado. No entanto, notei que quando inicio o PuTTY no meu computador desktop logo após o LED acender, o prompt de login não aparece imediatamente. Então eu verifiquei com

$ systemd-analyze plot > output.svg

O resultado mostra

insira a descrição da imagem aqui

Pergunta

Parece que meus serviços não iniciam depois network-online.target, o que há de errado aqui e como posso consertar?

Responder1

Quando houver uma dúvida sobre uma diretiva systemd, você pode usá-la man systemd.directivespara descobrir onde ela está documentada. Neste caso mostra que After=está documentado em man systemd.unit.

Nesse arquivo, mostra que a After=diretiva está listada em "[UNIT] SECTION OPTIONS", indicando que ela pertence à [Unit]seção do arquivo.

A mesma documentação também documenta as opções da seção [INSTALL] e After=não está listada lá.

Resumindo, sua After=diretiva estava no local errado do arquivo da unidade, portanto não teve efeito até que você a movesse para o local correto.

Responder2

Conserte-o modificando o serviço como

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

Ainda não entendi completamente o que estava fazendo, mas funciona agora. Alguém pode explicar?

Atualizar

Esta resposta foi criada por mim mesmo antes de chegar a resposta aceita.

informação relacionada