Analyse et solution moderne
Le script est une boucle occupée: il continue de lire les broches GPIO encore et encore. Il ne consomme pas beaucoup de mémoire mais garde le CPU occupé.
Vous devez définir la broche GPIO en mode bord. L' gpio
utilitaire dispose d'une commande wfi
(attendre l'interruption) que vous pouvez utiliser pour réagir à un déclencheur de front. ( gpio wfi
n'existait pas lorsque la question a été posée.)
set -e
gpio mode 0 in
gpio wfi 0 rising
echo password | sudo -S reboot
Une solution Python
Il existe une bibliothèque Python pour l'accès GPIO , qui prend en charge le mode Edge. Voici du code Python complètement non testé qui devrait faire ce que vous voulez.
#!/usr/bin/env python
import os
from RPi import GPIO
GPIO.wait_for_edge(0, GPIO.RISING)
system("sudo reboot")
Conseils supplémentaires sur la coque
(true)
pourrait être écrit juste true
. Les parenthèses créent un sous-processus, ce qui est complètement inutile.
`gpio read 0`
devrait être entre guillemets. Sans guillemets, la sortie de la commande est traitée comme une liste de modèles génériques de nom de fichier. Avec des guillemets doubles, la sortie de la commande est traitée comme une chaîne. Mettez toujours des guillemets autour des substitutions de commandes et des substitutions de variables: "$(some_command)"
, "$some_variable"
. En outre, vous devez utiliser la syntaxe $(…)
plutôt que `…`
: elle a exactement la même signification, mais la syntaxe backquote a quelques bizarreries d'analyse lorsque la commande est complexe. Donc:if [ "$(gpio read 0)" -eq 1 ]
Ne mettez pas le mot de passe root dans le script. Si le script s'exécute en tant que root, vous n'avez pas du tout besoin de sudo. Si le script ne s'exécute pas en tant que root, accordez à l'utilisateur exécutant le script l'autorisation de s'exécuter sudo reboot
sans fournir de mot de passe. Exécutez visudo
et ajoutez la ligne suivante:
userwhorunsthescript ALL = (root) NOPASSWD: /sbin/reboot ""
Notez que s'il y a une entrée pour le même utilisateur dans le fichier sudoers qui nécessite un mot de passe, l' NOPASSWD
entrée doit venir après.
Une fois que vous avez déclenché un redémarrage, vous n'avez pas besoin de rompre la boucle, le système s'arrêtera quand même.
Si vous décidez de continuer à utiliser ce script shell et que votre version de gpio
est trop ancienne pour avoir la wfi
sous - commande, voici une version améliorée qui ne vérifie que l'état du bouton toutes les secondes. Notez que comme la broche n'est lue qu'une fois par seconde, cela signifie que vous devez maintenir le bouton enfoncé pendant au moins une seconde pour être sûr que l'événement est détecté.
gpio mode 0 in
while sleep 1; do
if [ "$(gpio read 0)" -eq 1 ]; then
reboot
fi
done &