Raspberry Pi にログインすることなく外部からのボタン入力でシャットダウンさせます。実装はgo言語です
コードはGithubにも公開しています
動作環境
- HW: Raspberry Pi 4B
- OS: Ubuntu server 20.04 64bit
配線接続
GPIO2とGroundをメカニカルスイッチに接続する(ピンアサイン図)
コード
main.go
package main
import (
	"fmt"
	"log"
	"os/exec"
	"time"
	"periph.io/x/conn/v3/gpio"
	"periph.io/x/conn/v3/gpio/gpioreg"
	"periph.io/x/host/v3"
)
func main() {
	if _, err := host.Init(); err != nil {
		log.Fatal(err)
	}
	p := gpioreg.ByName("GPIO2")
	if p == nil {
		log.Fatal("Failed to find GPIO2")
	}
	if err := p.In(gpio.PullDown, gpio.FallingEdge); err != nil {
		log.Fatal(err)
	}
	for {
		counter := 0
		p.WaitForEdge(-1)
	countLoop:
		for {
			switch p.Read() {
			case gpio.Low:
				counter++
				if counter >= 200 {
					fmt.Printf("shutdown start...\n")
					if err := exec.Command("shutdown", "-h", "now").Run(); err != nil {
						log.Fatal(err)
					}
				}
			default:
				break countLoop
			}
			time.Sleep(10 * time.Millisecond)
		}
	}
}
プログラムを起動後、2秒以上スイッチを長押しするとシャットダウン処理が始まります
自動起動
ラズパイ起動時に自動でプログラムを起動させるため、systemdのサービスとして登録します
/etc/systemd/system/gpio-shutdown.serviceファイルを作成します
/etc/systemd/system/gpio-shutdown.service
[Unit]
Description = hardware shutdown daemon
[Service]
ExecStart=/opt/gpio-shutdown
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
/opt/gpio-shutdownはコードをビルドして生成されたバイナリファイルです。手動でコピーして配置しておきます
ファイルが用意できたらサービスを起動します
sudo systemctl start gpio-shutdown.service
sudo systemctl enable gpio-shutdown.service
サービスが正常に起動されたかを確認します
sudo systemctl status gpio-shutdown.service
Activeの項目がactive(running)であれば準備完了です。ラズパイを起動後、2秒以上スイッチを長押しするとシャットダウン開始します
参考
