我正在运行 RHEL6,并且正在尝试编写一个在插入和移除 USB 设备时触发的 udev 规则。我创建了一个名为80-usb.rules
in 的文件/etc/udev/rules.d/
,并为其提供了以下内容(到目前为止没有什么太具体的,只是想测试一下):
ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
我保存了文件并插入 USB 驱动器进行测试。但是,该文件/tmp/test
并未创建。
我认为我的 udev 规则应该与我的 USB 驱动器匹配,因为我可以udevadm info
在 USB 驱动器上运行,并且至少其中一个父设备具有属性SUBSYSTEMS=="usb"
。
为什么 udev 规则不会被触发?
我尝试运行udevadm test --action=add /path/to/device
,很明显.rules
我编写的文件正在被处理并且我的规则正在匹配。以下是输出中的一些相关行:
parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'
但仍然/tmp/test
不存在。我感到很困惑。显然,这条规则正在被匹配并且规则正在被应用。那么为什么RUN
execute指定的命令没有被执行呢?
答案1
您的规则必须给出可执行文件的绝对路径:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"
编辑:
如果你想执行一个脚本,你必须告诉哪个 shell 将执行它:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"
答案2
您必须确保以下几点:
- 命令中的路径
RUN
应该是绝对路径 - 该文件必须是可执行的
- 环境
PATH
限制在您命令的执行范围内
首先将此脚本文件添加到/lib/udev/touch.sh
vim /lib/udev/touch.sh
在该文件中写入:
#!/bin/bash
touch /tmp/test
使其可执行:
chmod +x /lib/udev/touch.sh
并将您的规则文件更改为:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"
重新加载你的 udev 规则
udevadm control --reload-rules
这将再次读取您的规则/lib/udev/rules.d/*
。直到现在,更改才适用。
请注意,udev 在简化的PATH
环境中执行您的脚本。您必须确保任何不在配置路径内的二进制文件都必须使用完整路径进行访问。您还可以扩展PATH
脚本中的环境。
set
通过将包装器脚本的输出记录到日志文件来检查定义的路径:
set >>/tmp/udev-env-test
它可能看起来像这样:
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'