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


12

fundo

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

O script não é importante aqui, apenas para mencionar que, como uso o controle de frequência, o script executa um loop infinito, para ligar e desligar o LED com freqüência. Portanto, este é um exemplo de serviço simples. No entanto, pelo menos a resposta aceita dessa pergunta me aconselha a definir o tipo como inativo. Portanto, meu arquivo de serviço se parece com

[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 que quando inicio a massa 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

Questão

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

Respostas:


11

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

Nesse arquivo, ele mostra que a After=diretiva está listada em "[UNIDADE] SEÇÃO OPÇÕES", indicando que ela pertence à [Unit]seção do arquivo.

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

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


Para ficar claro, neste caso "[Unidade]" é "[Serviço]", pois é um arquivo de serviço.
Faho # 18/16

Uma resposta passível de cópia com as correções teria sido muito melhor!
precisa saber é o seguinte

@GerardJP Melhor ensinar um homem a pescar do que alimentá-lo por um dia. Quando as pessoas sabem como usar a documentação do systemd, elas podem encontrar respostas autorizadas sem gastar tempo no StackExchange olhando documentos de terceiros.
Mark Stosberg

11

Ele foi 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 pode explicar?

Atualizar

Essa resposta foi criada por mim antes da resposta aceita.


Que a After=diretiva deve estar na [Unit]seção. É só isso.
Bigon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.