USB メモリを挿して Linux をシャットダウン

ほんとに小ネタですが、Linux PC をシャットダウンするスイッチの代わりに USBメモリを使うはなしです。

自宅にはヘッドレスの Linux PC がいくつかあるのですが、ラズパイだったり他の組み込み用の機器だったりすると電源ボタンがないことがままあります。
100 % 自分が悪いのですが、寝る前の段階でシャットダウンのためだけにリモート接続して操作するのが面倒でした。

そんなときに参考リンクの Window ソフトをみつけたのですが、そういえばこれだったら udev rule でできたよな ?ってことでやってみました。という記事です。

今回は、転がっていて使い道のない小容量の Kodak の USB メモリ をシャットダウンボタンの代わりに使います。この USB メモリが挿されたら systemctl poweroff コマンドを実行するように udev rule を書いていきます。
逆にいうと この設定のことを忘れて USB メモリを指すと問答無用でシャットダウンしちゃうので、 USB メモリ側になんか書いておくとかしたほうがいいかもしれません。

でまずは、特定の USB メモリというのを定義する必要があるのでどう認識しているか確認します、

; USBメモリがどこにぶら下がるか確認します。 /dev/sdc1 とかって答えるはず
$ lsblk 

; vendor id や product id を確認します。 (/dev/sdc1 だった場合)
$ udevadm info --attribute-walk  --name=/dev/sdc1

今回の例では idVendor: 346d、idProduct: 5678 だったので以下のようにした。
/etc/udev/rules.d/ 以下に好きなファイル名でファイルをつくります。
ユーザー定義のものは、99- から始めるのが通例なのでそれに従い 99-kodak-usb.rules とした。もちろん他より優先度が高いんだってことなら 50 か何でも好きな数字にしてもいいけど通常は 99 で問題ないはずです。

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="346d", ATTRS{idProduct}=="5678" RUN+="/usr/bin/systemctl poweroff"

; 動作確認するには、  /tmp あたりにログを書くといい
#ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="346d", RUN+="/bin/sh -c 'echo USB inserted >> /tmp/usb-test.log'"

udev ルールを反映させます。

; ルールを反映する
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger


; 以下を実行すると認識の様子をモニターできる。
$ sudo udevadm monitor --environment --udev

この状態で USB メモリを指すと PC がシャットダウンします。

参考

USBメモリの抜き差しでPCをシャットダウンできるソフト「USB Shutdown」 | フリーソフトラボ.com