分析と最新のソリューション
スクリプトはビジーループです。GPIOピンを繰り返し読み取り続けます。多くのメモリを消費しませんが、CPUをビジー状態に保ちます。
GPIOピンをエッジモードに設定する必要があります。gpio
ユーティリティがありwfi
ますが、エッジトリガに反応するために使用できるコマンド(割り込み待ちを)。(gpio wfi
質問されたときは存在しませんでした。)
set -e
gpio mode 0 in
gpio wfi 0 rising
echo password | sudo -S reboot
Pythonソリューション
エッジモードをサポートするGPIOアクセス用のPythonライブラリがあります。以下は、完全にテストされていないPythonコードです。
#!/usr/bin/env python
import os
from RPi import GPIO
GPIO.wait_for_edge(0, GPIO.RISING)
system("sudo reboot")
追加のシェルのヒント
(true)
ただ書くことができますtrue
。括弧はサブプロセスを作成しますが、これは完全に不要です。
`gpio read 0`
二重引用符で囲む必要があります。引用符がないと、コマンドの出力はファイル名のワイルドカードパターンのリストとして扱われます。二重引用符を使用すると、コマンドの出力は文字列として扱われます。コマンドの置換と変数の置換は常に二重引用符で囲みます:"$(some_command)"
、"$some_variable"
。また、構文$(…)
ではなく構文を使用する必要があります`…`
。これはまったく同じ意味ですが、コマンドが複雑な場合、バッククォート構文には解析の癖があります。したがって:if [ "$(gpio read 0)" -eq 1 ]
スクリプトにrootパスワードを含めないでください。スクリプトがrootとして実行されている場合、sudoはまったく必要ありません。スクリプトがrootとして実行されていない場合は、スクリプトを実行しているユーザーsudo reboot
に、パスワードを指定せずに実行する権限を与えます。visudo
次の行を実行して追加します。
userwhorunsthescript ALL = (root) NOPASSWD: /sbin/reboot ""
sudoersファイルに同じユーザーのエントリがあり、パスワードが必要な場合は、NOPASSWD
エントリを後にする必要があることに注意してください。
再起動をトリガーしたら、ループを解除する必要はありません。システムはとにかく停止します。
このシェルスクリプトを使い続けることに決め、バージョンがgpio
古すぎてwfi
サブコマンドを使用できない場合は、ボタンの状態を毎秒チェックするだけの改良版を次に示します。ピンは1秒に1回しか読み取られないため、イベントが確実にピックアップされるようにするには、ボタンを少なくとも1秒間押し続ける必要があることに注意してください。
gpio mode 0 in
while sleep 1; do
if [ "$(gpio read 0)" -eq 1 ]; then
reboot
fi
done &