Analisi e soluzione moderna
Lo script è un circuito affollato: continua a leggere ripetutamente i pin GPIO. Non consuma molta memoria ma mantiene occupata la CPU.
È necessario impostare il pin GPIO in modalità edge. L' gpio
utilità ha un wfi
comando (wait for interrupt) che puoi usare per reagire a un trigger di fronte. ( gpio wfi
non esisteva quando è stata posta la domanda.)
set -e
gpio mode 0 in
gpio wfi 0 rising
echo password | sudo -S reboot
Una soluzione Python
Esiste una libreria Python per l'accesso GPIO , che supporta la modalità edge. Ecco alcuni codici Python completamente non testati che dovrebbero fare quello che vuoi.
#!/usr/bin/env python
import os
from RPi import GPIO
GPIO.wait_for_edge(0, GPIO.RISING)
system("sudo reboot")
Ulteriori suggerimenti sulla shell
(true)
potrebbe essere scritto solo true
. Le parentesi creano un sottoprocesso, che è completamente inutile.
`gpio read 0`
dovrebbe essere tra virgolette doppie. Senza virgolette, l'output del comando viene trattato come un elenco di modelli jolly di nomi di file. Con virgolette doppie, l'output del comando viene trattato come una stringa. Metti sempre le virgolette doppie tra le sostituzioni di comandi e le sostituzioni variabili: "$(some_command)"
, "$some_variable"
. Inoltre, è necessario utilizzare la sintassi $(…)
anziché `…`
: ha esattamente lo stesso significato, ma la sintassi del backquote ha alcune stranezze di analisi quando il comando è complesso. Così:if [ "$(gpio read 0)" -eq 1 ]
Non inserire la password di root nello script. Se lo script è in esecuzione come root, non è necessario sudo. Se lo script non è in esecuzione come root, autorizza l'utente a eseguirlo sudo reboot
senza fornire una password. Esegui visudo
e aggiungi la seguente riga:
userwhorunsthescript ALL = (root) NOPASSWD: /sbin/reboot ""
Nota che se nel file sudoers è presente una voce per lo stesso utente che richiede una password, la NOPASSWD
voce deve venire dopo.
Una volta attivato il riavvio, non è necessario interrompere il ciclo, il sistema si arresterà comunque.
Se decidi di continuare a utilizzare questo script di shell e la tua versione di gpio
è troppo vecchia per avere il wfi
sottocomando, ecco una versione migliorata che controlla solo lo stato del pulsante ogni secondo. Si noti che poiché il pin viene letto solo una volta al secondo, ciò significa che è necessario tenere premuto il pulsante per almeno un secondo per essere sicuri che l'evento venga raccolto.
gpio mode 0 in
while sleep 1; do
if [ "$(gpio read 0)" -eq 1 ]; then
reboot
fi
done &