今回はUSBメモリ挿入でプログラムを実行する方法を紹介したいと思います。udevという仕組みを使用するとUSBメモリが挿入された時にシェルスクリプトやPythonコードを実行させることができます。
USBメモリの挿入をプログラム実行のスイッチとして使用できるので、電気回路でスイッチを作らなくてもよいため、回路が苦手な人にとっては重宝します。また、コンソールが開けない状態でも、USBメモリを持って入れば、スクリプトを実行することができます。
USBメモリのデバイス情報取得
udevの仕組みを使用するには、USBメモリのidVendor、idProductの情報が必要になりますので、lsusbコマンドで調べます。まず、USBメモリを外した状態でターミナルからlsusbコマンドを実行します。そのあと、USBメモリを挿入した状態でlsusbコマンドを実行します。コマンドの結果を比較すると挿入前と後で、デバイスが1つ追加されて
いると思います。これがUSBメモリのデバイス情報で、下記のように表示されます。
Bus 001 Device 005: ID AAAA:BBBB XXXX ... ...
・AAAA ⇒ idVendor
・BBBB ⇒ idProduct
・XXXX ⇒ USBメモリの製造メーカー
これでidVendor、idProductがわかりました。
rulesファイルの作成
/etc/udev/rules.dフォルダの中に、USBメモリを挿入した時の動作を定義したファイル(rulesファイル)を作成し、コードを追加します。ファイル名は "連番 + 任意の名前 + .rules" で作成します。
(今回は 10-usbmem.rules としました。このrulesファイルはいくつでも作ることができ、連番の数字の若い順に実行されます。)
下記コマンドでファイルを新規で開きます。
sudo nano /etc/udev/rules.d/10-usbmem.rules
下記のコードを追加して、ファイルを保存します。
ACTION=="add", \
SUBSYSTEMS=="usb", \
ATTRS{idVendor}=="AAAA", \
ATTRS{idProduct}=="BBBB", \
RUN+="/bin/bash /home/pi/test/test.sh"
1つの定義は1行で書かなければいけません。見ずらい場合は、文字列の最後に"\"を付けて改行してください。
パラメータの説明をします。
・ACTION ⇒ 動作を表します。挿入時は"add"、取り外し時は"remove"
・SUBSYSTEMS ⇒ USBを使う場合は"usb"
・ATTRS{idVendor} ⇒ idVendorの値
・ATTRS{idProduct} ⇒ idProductの値
・RUN ⇒ 実行するスクリプト
これでUSBメモリを挿入すると/home/pi/test.shのシェルスクリプトが実行されます。
シェルスクリプトの作成
USB挿入時にRaspberry Piがシャットダウンするスクリプト
※test.shにはchmodコマンドで実行権限(744)を付与しておいてください。
sudo nano /home/pi/test/test.sh
下記のようにtest.shにコードを記載します。
#!/bin/bash sudo shutdown -h now
準備が整ったら、USBメモリを外し再起動します。rulesファイルを修正後、再起動しないと反映されません。また、rulesファイルは起動時にも実行されるので、USBを挿入していると起動しないので注意してください。
(起動 ⇒ 起動シーケンスでrules実行 ⇒ test.sh実行 ⇒ シャットダウン)
それではRaspberry Piが起動したら、USBメモリを挿入してみてください。シャットダウンすれば成功です。
USB挿入時にpythonコードを実行するスクリプト
下記のようにtest.shを作成します。
#!/bin/bash SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR python3 test.py exit 0
pythonコードはabcフォルダを作成する下記プログラムを使用します。
test.pyを同じフォルダ(/home/pi/test/)に保存します。
import subprocess, shlex args = shlex.split("mkdir ./abc") proc = subprocess.call(args)
USBを挿入すると、test.pyと同じパスにabcというフォルダが作成されます。
USB挿入時にpipenv仮想環境のpythonコードを実行するスクリプト
#!/bin/bash SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR . ./.venv/bin/activate python test.py exit 0
test.pyは上記と同じです。
コンソールが使えない環境等で、USBメモリの挿抜をトリガーに、スクリプトを実行したり、シャットダウンしたりすることができるようになりました。意外と便利ですね。