Análise
O script é um loop ocupado: ele continua lendo os pinos do GPIO repetidamente. Não consome muita memória, mas mantém a CPU ocupada.
Você deve definir o pino GPIO no modo de borda. O autor do WiringPi está considerando adicionar um comando wait
ao gpio
utility, mas atualmente não há como reagir a um trigger de borda a partir de um script de shell.
Uma solução Python
Existe uma biblioteca Python para acesso ao GPIO , que suporta o modo de borda. Aqui está um código Python completamente não testado que deve fazer o que você quiser.
#!/usr/bin/env python
import os
from RPi import GPIO
GPIO.wait_for_edge(0, GPIO.RISING)
system("sudo reboot")
Dicas adicionais sobre o shell
(true)
pode ser escrito apenas true
. Os parênteses criam um subprocesso, o que é completamente desnecessário.
'gpio read 0'
deve estar entre aspas duplas. Sem aspas, a saída do comando é tratada como uma lista de padrões de caractere curinga de nome de arquivo. Com aspas duplas, a saída do comando é tratada como uma string. Sempre coloque aspas duplas em torno das substituições de comandos e substituições de variáveis: "$(some_command)"
, "$some_variable"
. Além disso, você deve usar a sintaxe $(…)
em vez de '…'
: ela tem exatamente o mesmo significado, mas a sintaxe de backquote tem algumas peculiaridades de análise quando o comando é complexo. Assim: if [ "$(gpio read 0)" -eq 1 ]
Não coloque a senha de root no script. Se o script estiver sendo executado como root, você não precisará do sudo. Se o script não estiver sendo executado como root, conceda ao usuário que executa o script a permissão para executar sudo reboot
sem fornecer uma senha. Execute visudo
e adicione a seguinte linha:
userwhorunsthescript ALL = (root) NOPASSWD: /sbin/reboot ""
Observe que, se houver uma entrada para o mesmo usuário no arquivo sudoers que requer uma senha, a entrada NOPASSWD
deve vir depois.
Quando você acionar uma reinicialização, não será necessário interromper o loop, o sistema parará de qualquer maneira.
Se você decidir continuar usando este script de shell, aqui está uma versão melhorada que só verifica o estado do botão a cada segundo. Observe que, como o pino é lido apenas uma vez por segundo, isso significa que você precisa manter o botão pressionado por pelo menos um segundo para ter certeza de que o evento foi selecionado.
gpio mode 0 in
while sleep 1; do
if [ "$(gpio read 0)" -eq 1 ]; then
reboot
fi
done &