![我如何检查 udev 规则是否已触发?](https://linux22.com/image/1386405/%E6%88%91%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%20udev%20%E8%A7%84%E5%88%99%E6%98%AF%E5%90%A6%E5%B7%B2%E8%A7%A6%E5%8F%91%EF%BC%9F.png)
我正在努力了解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 调用(它可能为单个添加的设备运行多次,这可能是也可能不是您想要的...)