USBペンドライブ/フラッシュドライブにアクセスするC++プログラムがあります。現在挿入されているフラッシュドライブで機能します。通常のC++プログラムは、実行するまで実行されません。しかし、フラッシュドライブが挿入されるたびにプログラムが自動的に実行されるようにしたかったのです。どうやってやるの?
一般的な用途、USBストレージでプログラムを実行する場合。ルールの一致にドライバーを使用します。
udev
ルールファイルを追加します
Sudo nano /etc/udev/rules.d/90-detect-storage.rules
このルールを追加
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram"
プログラムがディスクを区別して、異なる操作を実行するようにしたい場合は、次を使用します(シリアル番号または任意の属性を渡すことができます)。
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/pathto/yourprogram $env{ID_VENDOR_ID} $env{ID_MODEL_ID}"
すべてのルールをリロードする
Sudo udevadm control --reload-rules
フラッシュドライブを取り外して再接続する
注:
このルールを使用して、ルールがトリガーされたときにログを作成するものをテストしました。
ACTION=="add", DRIVERS=="usb-storage", DRIVER=="sd", RUN+="/bin/sh -c 'echo $env{ID_VENDOR_ID} $env{ID_MODEL_ID} >> /home/username/Desktop/usb-storage.log'"
行の先頭に#
を追加することにより、不要なルールをコメント化できます。ルールファイルには複数のルールを含めることができます。
使用可能なすべてのenv
変数を確認するには、次を使用します。
ACTION=="add", DRIVERS=="usb-storage", RUN+="/bin/sh -c 'echo == >> /home/username/Desktop/usb-storage-env.log; env >> /home/username/Desktop/usb-storage-env.log'"
ルールの一致に使用するパラメーターを確認するには、次を実行します。
Sudo udevadm info --name=/dev/sdb1 --attribute-walk
参照:
udev
を使用して、任意のコマンドを実行できます。動作させるには、/etc/udev/rules.d/
でルールを作成します:
Sudo nano /etc/udev/rules.d/my-usb-device.rules
そして入力してください:
ACTION=="add", ATTRS{idProduct}=="XXXX", ATTRS{idVendor}=="YYYY", RUN+="/location/of/my/command"
注:XXXX
およびYYYY
の値は、lsusb
出力から取得されます。