Análise e solução moderna
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 gpio
utilitário possui um wfi
comando (aguarde interrupção) que você pode usar para reagir a um gatilho de borda. ( gpio wfi
não existia quando a pergunta foi feita.)
set -e
gpio mode 0 in
gpio wfi 0 rising
echo password | sudo -S reboot
Uma solução Python
Há 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ê deseja.
#!/usr/bin/env python
import os
from RPi import GPIO
GPIO.wait_for_edge(0, GPIO.RISING)
system("sudo reboot")
Dicas adicionais de shell
(true)
poderia ser escrito apenas true
. Os parênteses criam um subprocesso, 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 curinga do nome do arquivo. Com aspas duplas, a saída do comando é tratada como uma sequência. 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 aspas retroativas possui algumas peculiaridades de análise quando o comando é complexo. Portanto:if [ "$(gpio read 0)" -eq 1 ]
Não coloque a senha 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, dê ao usuário que está executando 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 exija uma senha, a NOPASSWD
entrada deverá ser posterior.
Depois de iniciar uma reinicialização, você não precisa interromper o ciclo, o sistema será interrompido de qualquer maneira.
Se você decidir continuar usando esse script de shell, e sua versão gpio
for muito antiga para ter o wfi
subcomando, aqui está uma versão aprimorada que verifica apenas o estado do botão a cada segundo. Observe que, como o pino é lido apenas uma vez por segundo, isso significa que você deve manter o botão pressionado por pelo menos um segundo para garantir que o evento seja selecionado.
gpio mode 0 in
while sleep 1; do
if [ "$(gpio read 0)" -eq 1 ]; then
reboot
fi
done &