Eu tenho um Raspberry Pi no Raspbian Stretch e quero habilitar alguns pinos 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, 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 conforme o esperado), 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?
É tão simples quanto observar que não há
WantedBy
configuração nessa seção. Você disse ao systemd para ativar o serviço, mas na verdade não descreveu qual destino deve desejá-lo quando estiver ativado.Não é sábio fazer isso como uma prática diária. Deixe a saída padrão ser registrada até que se torne um problema real (o que claramente está longe de ser no caso de alguns
echo
comandos).E, da mesma forma, não nomeie o shell Bourne Again, a menos que você esteja explicitamente contando com Bashisms, o que (novamente) você não está fazendo apenas com alguns
echo
comandos.Uma década atrás, o pessoal do Debian e do Ubuntu se esforçou bastante para tirar o shell Bourne Again do processo de inicialização do sistema sempre que possível, substituindo-o pelo shell Almquist, que tinha muito menos sobrecarga de inicialização no modo não interativo, o que acelerou o bootstrap acentuadamente. Usando ociosamente em
/bin/bash
todo o lugar - em unidades de serviço systemd nada menos! — em vez de/bin/sh
, desfaz esse bom trabalho.