我正在 OpenSuse Leap 上使用 Udev 规则,并且在 USB 设备插入我的系统后尝试运行一个简单的小脚本。
但是,我在关键字“RUN+=”中添加的脚本无法运行。
以下是以下步骤:
1)我写了规则“10_MY_RULES.规则“根据提供的信息乌德瓦德姆信息。
KERNEL=="sdf1", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ATTRS{product}=="Flash Drive", ATTRS{manufacturer}=="Samsung",ATTRS{idProduct}=="1000", ATTRS{idVendor}=="090C", RUN="/home/user/bin/script.sh"
我的剧本“脚本文件”如下:
#!/bin/bash; mkdir /home/user/Desktop/CREATE_FOLDER_TEST
2) OpenSuse Leap 有几个地方分配 udev 规则。
这些是地点:
- /etc/udev/rules.d
- /usr/lib/udev/rules.d
- /run/udev/rules.d
我把我的规则写在“/run/udev/rules.d“考虑到当我插入 USB 设备时乌德夫将在下创建一个访问文件/跑步。
3)我运行以下命令:
- udevadm 控制--重新加载规则
- udevadm 触发器
4)完成后我也运行“udevadm 监视器” 来查看当外围设备插入后我的系统正在做什么,在本例中是我的 USB。
5) 当我的闪存驱动器被添加到系统中时,我注意到没有执行任何操作,我的脚本没有运行。所以我运行以下命令来触发特定设备上的规则
- udevadm test --action=add /path/to/device
我注意到我的规则正在被阅读,正如您在图片的最后一行中看到的那样......
运气不佳,我修改了规则并进行了修改。我添加更多内核、子系统、属性等
以上所有内容我都以两种模式运行根和用户。
答案1
您是否尝试过手动执行script.sh
?
我尝试过,并得到了
bash: ./script.sh: /bin/bash;: bad interpreter: No such file or directory
#!
您不能在脚本行上使用分号作为命令分隔符。该行仅用于指定脚本解释器及其可能的选项,仅此而已。
事实上,你的规则似乎失败了,因为你script.sh
没有执行;你的 udev 规则可能没问题。正如 @eblock 评论的那样,您应该使用最少必要数量的检查:如果您的规则不起作用,您应该删除一些检查,而不是添加更多检查。
另请注意,它/run
不是持久性的,因为它位于 tmpfs 文件系统(= 本质上是 RAM 磁盘)上。您放入其中的任何内容都会在下次重新启动后消失。因此,/run/udev/rules.d
应仅用于由其他规则或其他自动化生成的自动生成的规则。
/usr/lib/udev/rules.d
用于发行版的标准规则。系统管理员应该/etc/udev/rules.d
根据需要补充或覆盖标准规则。