我有一个 C++ 程序可以访问 USB 笔式驱动器/闪存驱动器。它适用于当前插入的闪存驱动器。普通的 C++ 程序只有在我们运行它时才会执行。但我希望该程序在插入闪存驱动器时自动运行。我该怎么做?
答案1
对于一般用途,如果您想在任何 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 脚本中传递 ATTR{idVendor} 作为参数
- 编写 udev 规则作者:Daniel Drake
答案2
您可以使用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