如何让 udev 规则发挥作用?

如何让 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 设备会写入文件,但什么也没发生。我错在哪里?

答案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 获得的。

  • udevPROGRAM需要在、TESTRUN中使用的脚本/程序/文件的完整路径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、、%pudev%n变量(设备内核名称、设备路径、设备编号)

因此对于你的情况:

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

相关内容