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

9

Plano de fundo

Estou escrevendo um script simples para ser executado no Raspbain em Raspberry Pi 2, basta ligar um LED para indicar que estou pronto para me conectar com o SSH em meu computador desktop.

O script não é importante aqui, apenas para mencionar que, como eu uso o controle de frequência, o script está executando um loop infinito, para ligar e desligar o LED com frequência. Então este é um exemplo de serviço simples. No entanto, pelo menos o aceito resposta desta pergunta me avisa para definir o tipo para ocioso. Então, meu arquivo de serviço 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 é executado conforme o esperado. No entanto, notei quando começo a putty no meu computador desktop logo após o LED acender o prompt de login não aparecer imediatamente. Então eu chequei com

$ systemd-analyze plot > output.svg

O resultado mostra

Pergunta

Parece que meus serviços não começam depois de network-online.target , o que está errado aqui e como posso corrigi-lo?

    
por Earth Engine 27.10.2016 / 11:56

2 respostas

8

Quando há uma pergunta sobre uma diretiva systemd, você pode usar man systemd.directives para descobrir onde ela está documentada. Neste caso, mostra que After= está documentado em man systemd.unit .

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

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

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

    
por 27.10.2016 / 16:06
7

Corrigido, 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 eu estava fazendo, mas funciona agora. Alguém por favor pode explicar?

Atualizar

Essa resposta foi criada por mim mesmo antes que a resposta aceita seja recebida.

    
por 27.10.2016 / 12:50