Análisis y solución moderna.
El script es un ciclo ocupado: sigue leyendo los pines GPIO una y otra vez. No consume mucha memoria pero mantiene ocupada la CPU.
Debe configurar el pin GPIO en modo borde. La gpio
utilidad tiene un wfi
comando (esperar interrupción) que puede usar para reaccionar a un disparador de borde. ( gpio wfi
no existía cuando se hizo la pregunta).
set -e
gpio mode 0 in
gpio wfi 0 rising
echo password | sudo -S reboot
Una solución Python
Hay una biblioteca de Python para acceso GPIO , que admite el modo de borde. Aquí hay un código de Python completamente no probado que debería hacer lo que quieras.
#!/usr/bin/env python
import os
from RPi import GPIO
GPIO.wait_for_edge(0, GPIO.RISING)
system("sudo reboot")
Consejos de carcasa adicionales
(true)
podría escribirse solo true
. Los paréntesis crean un subproceso, que es completamente innecesario.
`gpio read 0`
debe estar entre comillas dobles. Sin comillas, la salida del comando se trata como una lista de patrones comodín de nombre de archivo. Con comillas dobles, la salida del comando se trata como una cadena. Siempre ponga comillas dobles alrededor de las sustituciones de comandos y las sustituciones de variables: "$(some_command)"
, "$some_variable"
. Además, debe usar la sintaxis en $(…)
lugar de `…`
: tiene exactamente el mismo significado, pero la sintaxis de la comilla inversa tiene algunas peculiaridades de análisis cuando el comando es complejo. Así:if [ "$(gpio read 0)" -eq 1 ]
No ponga la contraseña de root en el script. Si el script se ejecuta como root, no necesita sudo en absoluto. Si el script no se está ejecutando como root, entonces otorgue al usuario que ejecuta el script el permiso para ejecutarse sudo reboot
sin proporcionar una contraseña. Ejecute visudo
y agregue la siguiente línea:
userwhorunsthescript ALL = (root) NOPASSWD: /sbin/reboot ""
Tenga en cuenta que si hay una entrada para el mismo usuario en el archivo sudoers que requiere una contraseña, la NOPASSWD
entrada debe aparecer después.
Una vez que activa un reinicio, no necesita romper el ciclo, el sistema se detendrá de todos modos.
Si decide seguir usando este script de shell y su versión de gpio
es demasiado antigua para tener el wfi
subcomando, aquí hay una versión mejorada que solo comprueba el estado del botón cada segundo. Tenga en cuenta que dado que el pin solo se lee una vez por segundo, esto significa que debe mantener el botón presionado durante al menos un segundo para asegurarse de que el evento se detecte.
gpio mode 0 in
while sleep 1; do
if [ "$(gpio read 0)" -eq 1 ]; then
reboot
fi
done &