我正在尝试设置一个脚本,每次插入 USB 设备时都会运行。我创建了文件/etc/udev/rules.d/90-local.rules并添加了以下规则:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
问题是,当驱动器连接时,什么都没有发生。出于调试目的,脚本被设计为使用notify-send发送通知,该程序已安装并从终端正常运行。
脚本的路径是正确的,因为我已经在终端中毫无问题地运行了该精确的命令。
答案1
我也遇到了同样的问题。这对我有用:
尝试将您的脚本复制到/usr/local/bin
您的文件中并更改该目录.rules
。
另外,我不知道 SYSFS 是什么,但我更喜欢使用 ATTR 属性。
以下行是我的.rules
文件的内容:
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", ATTRS{vendor}=="SanDisk ", RUN+="/usr/local/bin/backup.sh"
答案2
notify-send
需要访问你的 DBus 会话总线,但由于以下两个原因,它无法访问该总线:
没有关于会话的信息。当由 udev 启动时,你的脚本知道没有什么关于您登录的位置或是否登录。使用 X11 的多席位仍然很棘手,但用户切换适用于 X11 和控制台会话。许多人还通过网络使用 SSH、VNC 和 NX。
(
DISPLAY=:0
有一半的时间会起作用,但那仍然猜测最好。)DBus 策略拒绝。即使您的脚本以某种方式找到您的 X11 会话,它也无法发送通知,因为脚本是以
root
您的用户帐户而不是您的用户帐户运行的。
答案3
您可以尝试通过供应商和产品 ID 来匹配设备。以下自定义规则对我有用:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0763", ATTR{idProduct}=="019b", RUN+="/usr/bin/aconnect 20 128"
连接设备后,您可以在 lsusb 输出或 dmesg 中看到 idVendor 和 idProduct。
答案4
也许,您可能需要在脚本中添加一个sleep
,以便让 USB 设备有机会“安顿下来”?例如,USB 3G 调制解调器,模式切换以使 /dev/ttyUSB 由内核启动并运行。