如何使udev规则有效?

我想学习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设备会在文件中写入但没有任何反应。 我哪里错了?

在RUN中,您必须将路径放入脚本。 见man udev

将程序添加到要为特定设备执行的程序列表中。 这只能用于非常短的运行任务。 长时间运行事件过程可能会阻止此设备或从属设备的所有其他事件。 需要立即将长时间运行的任务与事件过程本身分离。

例如,创建一个新脚本,在/lib/udev使用sudo -H gedit /lib/udev/hello.sh说出hello.sh并将下一行放入其中:

 #!/bin/bash echo HELLO ! > /home//udev_test_log.txt 

使用您的用户名更改 。 保存文件,关闭它并使其可执行:

 chmod +x /lib/udev/hello.sh 

/etc/udev/rules.d/01-my-first-udev.rules文件中添加一条新规则,如下所示:

 ACTION=="add", RUN+="/lib/udev/hello.sh" 

实际上,我无法得到这方面的参考; 但这是Try&Error得到的东西。

  • udev需要在PROGRAMTESTRUNIMPORT使用的脚本/程序/文件的完整路径。

  • udev不支持重定向操作。

  • udev可以使用参数处理命令。

  • udev有可变替换。

所以你可以写多function脚本(不只是盲/单任务脚本:)),确保它适用于我的例子:

 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%n udev变量(设备内核名称,设备路径,设备编号)

所以对于你的情况:

 ACTION=="add", RUN+="/bin/sh -c 'echo HELLO ! > /home/victor/udev_test_log.txt'"