Linuxではおなじみのudevルール。
USBが挿入された時にプログラムを実行、逆に抜去された時にプログラムを実行したい。なときにはudevルールを記述すればよいのですが、今回はそのudevルールがうまく動作しなかったので備忘録として原因と対策をまとめておく。
目次
udevルールのACTION
今回usbを挿入した場合にhoge.shの実行を、そして抜去した時には、作成された中間ファイルの削除を行いたかった。
そのため記述したudevルールのACTION部分は以下のようになる。
ACTION=="add",ENV{ID_BUS}=="usb",ENV{ID_FS_TYPE}=="vfat",RUN+="/home/pi/hoge.sh"
ACTION=="remove",ENV{ID_BUS}=="usb",ENV{ID_FS_TYPE}=="vfat",RUN+="/bin/rm hogefile*"
udevルールがうまく動作しない
上記の記述だと挿入した際のaddアクション(hoge.sh)は実行されるのだが、removeアクション(中間ファイルの削除)は実行されなかった。
ENV
の指定がマズイのかと思い以下のコマンドを打ち、
その後にUSBを挿入してID_BUS
とID_FS_TYPE
を確認。
$ udevadm monitor --property
ですが、指定した通りID_BUS=usb
、ID_FS_TYPE=vfat
で間違いなかった。
だったらRUNの部分を疑ってみる。
今回は中間ファイル一式を削除したいので/bin/rm以降にワイルドカードでファイル指定。hogefile*
(hogefile~というファイルすべて削除)
ワイルドカードが怪しい??
となんとなくの勘でワイルドカードを使用せず1ファイル消去を実行するとサクッと動いた。
解決方法
...ということでudevルールにワイルドカードを使うのがNGのようだ。
ワイルドカードを使って複雑なことがしたいというのならばshellに記述してudevルールからそのshellを呼び出してあげればいい。
また一つ勉強になった。
ばいちゃ。
コメント