我想学习 udev 规则。以下是我所做的:
victor@X301A1:~$ ls /etc/udev/rules.d/
70-persistent-cd.rules 70-persistent-net.rules README
然后:
victor@X301A1:~$ sudo gedit /etc/udev/rules.d/01-my-first-udev.rules
我的规则:
ACTION=="add", RUN+="echo HELLO ! > /home/victor/udev_test_log.txt"
保存文件后:
sudo udevadm control --reload-rules
我以为连接 USB 设备会写入文件,但什么也没发生。我错在哪里?
答案1
在运行中,您必须输入脚本的路径。请参阅man udev
:
将程序添加到要为特定设备执行的程序列表中。这只能用于运行时间非常短的任务。长时间运行事件进程可能会阻止此设备或相关设备的所有后续事件。长时间运行的任务需要立即与事件进程本身分离。
例如,创建一个新脚本,hello.sh
在/lib/udev
其中sudo -H gedit /lib/udev/hello.sh
输入以下几行:
#!/bin/bash
echo HELLO ! > /home/<username>/udev_test_log.txt
用您的用户名更改<username>
。保存文件,关闭它并使其可执行:
chmod +x /lib/udev/hello.sh
在您的文件中添加一条新规则,/etc/udev/rules.d/01-my-first-udev.rules
如下所示:
ACTION=="add", RUN+="/lib/udev/hello.sh"
答案2
实际上,我无法获得对此的参考;但这是通过 Try & Error 获得的。
udev
PROGRAM
需要在、TEST
或RUN
中使用的脚本/程序/文件的完整路径IMPORT
。udev
不支持重定向操作。udev
可以处理带有参数的命令。udev
具有变量替换。
因此,您可以编写多功能脚本(而不仅仅是盲目/单任务脚本:)),确保它对我有用的例子:
KERNEL=="2-1.2:1.[0-9]*", DRIVER!="usb-storage", RUN+="/bin/sh -c 'echo -n %k,%p > /home/sneetsher/Desktop/%n.txt'"
/bin/sh
绝对路径>
重定向在 shell 内部处理-c '...'
2 个命令参数%k
、、%p
udev%n
变量(设备内核名称、设备路径、设备编号)
因此对于你的情况:
ACTION=="add", RUN+="/bin/sh -c 'echo HELLO ! > /home/victor/udev_test_log.txt'"