无法使用 udev 规则运行脚本

Ham*_*frq 4 linux udev

Prescript:我已经搜索过类似的问题,但找不到有用的答案。

背景:我使用的是 Fedora 64 位。我想在连接 USB 时执行特定的脚本 /bin/usbattached.sh。我正在使用金士顿 Datatraveller USB 棒,其供应商 ID 为 0951,产品 ID 为 1660(从 dmesg 和其他方法中找到)。我在我的机器上找到了两个 udev rules.d 目录,分别是 /etc/udev/rules.d 和 /lib/udev/rules.d 因为我不确定要使用哪个目录,所以我在这两个目录中创建了我的规则文件上面提到的目录。下面是我的规则

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1660", RUN+="/bin/usbattached.sh"
Run Code Online (Sandbox Code Playgroud)

我已经删除了 ACTION,将 RUN+= 更改为 RUN=,将其写入新文件以及预先存在的规则文件中,所有这些都没有运气。

我用

udevadm control --reload-rules 
Run Code Online (Sandbox Code Playgroud)

systemctl restart udev.service  
Run Code Online (Sandbox Code Playgroud)

重新启动udev。

当我在我的设备上运行 udevadm test 时,它显示它确实读取了我的规则文件,但脚本不起作用。任何调试它的方法都将受到高度赞赏。

手动运行时,脚本 /bin/usbattached.sh 将通知发送到屏幕的右上角,在屏幕上回显一条消息并将当前日期/时间附加到 ~/op 文件中。不幸的是,连接 USB 时,上述操作均未执行。

编辑:将“sleep 10”添加到我的 usbattached.sh 脚本后,我注意到大约在 18 秒后安装了 USB。该时间也随着值从 10 的变化而几乎呈线性变化。看起来脚本正在运行,但我没有任何通知,也没有在输出文件中附加新行

Ham*_*frq 7

我只是犯了几个愚蠢的错误。以下是没有输出的原因

  1. udev 不会向任何类型的终端/通知生成输出。我在这里找到

udev 不会在任何活动终端上运行这些程序,也不会在 shell 上下文中执行它们。确保你的程序被标记为可执行,如果它是一个shell脚本,确保它以适当的shebang开头(例如#!/bin/sh),并且不要期望任何标准输出出现在你的终端上。

  1. 为了将输出重定向到文件,我使用了 ~ 而不是用户主目录的整个路径。将其更改为绝对路径确实产生了输出。为了记录,我把我的规则放在12-hf-usb.rules. 我面临的唯一问题是脚本执行了两次,即使在使用RUN=. 找到答案后,我将对其进行编辑。看起来我必须使规则更具体,以仅匹配一个设备。目前对我来说并不重要所以我会跳过它

很多人在使用 udev 时都面临着问题。以下是解决问题的一些帮助:

udevinfo和相关工具已被替换udevadm。下面是一些有用的命令:

  • udevadm monitor --udev 在添加/删除硬件时实时查看 udev 活动
  • lsusb 查看连接的 USB 设备
  • udevadm info --attribute-walk --name /dev/sdc? 查看设备的分层详细信息

来源:http : //www.jpichon.net/blog/2011/12/debugging-udev-rules/


小智 5

关于脚本运行两次。

这是因为脚本为sdcsdc1事件运行。要修复,请使用带有 ATTR{partition} 的 udev 规则。IE :

 ACTION=="add", SUBSYSTEM=="block", ATTR{partition}=="*", RUN+=...
Run Code Online (Sandbox Code Playgroud)