Por que os scripts systemd não estão produzindo os resultados esperados na inicialização, mas depois corretamente?

1

Eu tenho um Raspberry Pi no Raspbian Stretch e quero ativar alguns pinos do GPIO no momento da inicialização.

Eu escrevi o seguinte serviço:

[Unit]
Description=GPIO23 exported as output, value off

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo "23" > /sys/class/gpio/export'
ExecStart=/bin/bash -c 'echo "out" > /sys/class/gpio/gpio23/direction'
ExecStart=/bin/bash -c 'echo "0" > /sys/class/gpio/gpio23/value'
StandardOutput=null

[Install]
Alias=gpio23.service

Após o login via SSH, eu verifico o resultado:

pi@Hi-Fi:~ $ systemctl status gpio23
● gpio23.service - GPIO23 exported as output, value off
   Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled)
   Active: inactive (dead)
pi@Hi-Fi:ls /sys/class/gpio/
export  gpiochip0  unexport

Como não foi executado (ou não funcionou como pretendido), inicio o serviço manualmente:

pi@Hi-Fi:~ $ sudo systemctl start gpio23
[sudo] password for pi:
pi@Hi-Fi:~ $ systemctl status gpio23
● gpio23.service - GPIO23 exported as output, value off
   Loaded: loaded (/lib/systemd/system/gpio23.service; linked; vendor preset: enabled)
   Active: inactive (dead)

Jan 01 19:31:12 Hi-Fi systemd[1]: Starting GPIO23 exported as output, value off...
Jan 01 19:31:12 Hi-Fi systemd[1]: Started GPIO23 exported as output, value off.
pi@Hi-Fi:~ $ ls /sys/class/gpio/
export  gpio23  gpiochip0  unexport

Agora funciona.

Como posso fazê-lo funcionar imediatamente como pretendido?

    
por FarO 01.01.2018 / 19:41

1 resposta

3
[Install]
Alias=gpio23.service

É tão simples quanto observar que não há nenhuma configuração WantedBy nessa seção. Você disse ao systemd para habilitar o serviço, mas na verdade não descreveu qual destino deve desejá-lo quando estiver ativado.

StandardOutput=null

Não é sensato fazer isso como uma prática cotidiana. Deixe a saída padrão ser registrada até que se torne um problema real para fazê-lo (o que claramente está longe de ser no caso de alguns comandos echo ).

ExecStart=/bin/bash …

E, da mesma forma, não nomeie o shell Bourne Again, a menos que você esteja explicitamente contando com os Bashisms, que (novamente) você não está com apenas alguns comandos echo .

Uma década atrás, o pessoal do Debian e do Ubuntu tentaram tirar o shell Bourne Again do processo de bootstrap do sistema onde quer que fosse possível, substituindo-o pelo shell Almquist, que tinha muito menos sobrecarga de inicialização em ambientes não interativos. modo, que acelerou bootstrap marcadamente. Idly usando /bin/bash em todo o lugar - em unidades de serviço systemd não menos! - em vez de /bin/sh , desfaz esse bom trabalho.

    
por 01.01.2018 / 22:24