我如何检查 udev 规则是否已触发?

我如何检查 udev 规则是否已触发?

我正在努力了解udev, 在下面Ubuntu 13.10(活泼的蝾螈)。

这是我的第一个简单的95.usbbackup.规则规则:

ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"

下面是脚本(已经chmodded +x我的备份文件

#!/bin/bash
touch /tmp/test

当我插入外部驱动器时什么也没有发生。我如何检查(日志、命令等)规则是否触发?

答案1

使用 udev / systemd 版本 241 或类似版本,以 root 身份:

udevadm control --log-priority=debug
journalctl -f

或者使其永久生效,再次以 root 身份:

vi /etc/udev/udev.conf
# edit the log level as described in "man udev.conf"
systemctl restart systemd-udevd
journalctl -f

PS:在我看来,这是最常见的错误的答案如下:

udevadm -d 测试 /设备/哪里/是/我的/设备 |& 更少

...但这存在一些问题。主要有:

  • where/is/my/device? 繁琐、复杂、容易出错。

  • 将旧答案与最近的 udev 版本 241 输出进行比较,udevadm test似乎显示的信息比以前少了。

  • udevadm -d test 只是模拟!每次它都会警告:

    此程序仅用于调试,它不运行任何由 RUN 键指定的程序。它可能会显示不正确的结果,因为某些值可能不同,或者在模拟运行时不可用。

udevadm test是为了制定新规则,而不是为了解决损坏、缺失或覆盖的规则的问题。

答案2

udevadm test $(udevadm info --query=path --name=device_name)应该告诉你哪些命令在设备插件上执行,引用udev相关规则。例如:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...

答案3

我确信这应该可行。编辑规则后重新加载 udev 规则:

udevadm control --reload-rules && udevadm trigger以 root 身份运行。

答案4

我最终做的一件事是,在一个我更改内容的能力有限的系统上(启用调试、更改日志记录等 - 我可以做到,但我必须覆盖一些配置管理工具),只需运行一个记录到 /tmp 的附加命令。例如,您可以添加第二个运行命令:

RUN+="/bin/sh -c 'echo $(date) $(env) >>/tmp/udev-debug.log'"

添加任何你喜欢的东西,包括字符串替换udev 手册页中描述。请确保附加日志,以便捕获符合规则的每个 udev 调用(它可能为单个添加的设备运行多次,这可能是也可能不是您想要的...)

相关内容