如果我使用udevadm触发器,为什么我的udev规则会运行,但不是在启动时?

我无法运行udev规则。 这是一个例子:

我有一个规则/etc/udev/rules.d/99-test.rules ,其中包含:

 ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi" 

sayhi只有:

 #!/bin/bash date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi 

这是一台Intel机器,我显然有很多厂商的0x8086 PCI设备:

 root@imtrobot:~# lspci -n |grep 8086 00:00.0 0600: 8086:2770 (rev 02) 00:02.0 0300: 8086:2772 (rev 02) 00:1d.0 0c03: 8086:27c8 (rev 01) [ etc. 12 lines total ] 

然而,当我启动时, /saidhi将根本不会被创建,或者将包含1或2个日期行。

如果,在启动后,我运行udevadm trigger --action=add --subsystem-match=pci 然后 /saidhi将获得完全正确的添加日期数。

为什么在启动过程中这不起作用?

我实际上有一种方法可以等待恰当的时间,而不是任意的30秒。 我在Raspberry Pi上做了它,在连接时自动挂载所有连接的USB磁盘,但也在启动时自动挂载。

该规则与您的规则类似:

 $ sudo cat /etc/udev/rules.d/10-usb_automount.rules KERNEL=="sd*", RUN+="/home/pi/bin/usb-automount" 

现在脚本实际上是一个递归调用(我知道这是邪恶的):

 $ cat /home/pi/bin/usb-automount #!/bin/sh ROOT_RW=`mount | grep 'dev/root' | grep -E '\(.*rw.*\)'` if [ -z "$ROOT_RW" ]; then sleep 3 /home/pi/bin/usb-automount & disown else /home/pi/bin/usb-automount.sh fi 

请注意,“grep’dev / root’”特定于Raspbian OS,因此在Ubuntu上,您需要设计自己的grep来检测rootfs(甚至更好地设计一些通用的grep)。 请注意,脚本将在后台调用并退出,并且只有rootfs为“rw”才会调用正确的安装脚本。 脚本“/home/pi/bin/usb-automount.sh”执行实际安装或在您的情况下执行日志记录。

请注意,此脚本仍需要3秒钟才能执行,因此您可以通过更改为:

 if [ -z "$ROOT_RW" ]; then ( sleep 3; /home/pi/bin/usb-automount ) & disown else /home/pi/bin/usb-automount.sh fi 

但是我从来没有检查过,也不知道这是否会按预期工作(我不是脚本专家)。

正如其他人所提到的, udevRUN=指令启动的进程应该是短期运行的 。 我想建议另一种更简单的方法,通过at命令中使用system scheduler将长时间运行的进程与udev 解耦

 ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/usr/bin/at -M -f /sayhi now" 

只要确保你的/sayhi脚本是/bin/sh兼容的 – 这是使用的shell。

我教过与@dmd相同的原因,PCI文件在文件系统重新安装为rw 。 (但有时,一些PCI事件发生后,竞争条件,并行工作)

 dmesg | grep -i -e mount -e pci 

@Sparhawk的sleep想法对我来说似乎很好。 我想这就是为什么它不起作用(参考: man udev ):

这只能用于非常短时间运行的前台任务。 长时间运行事件过程可能会阻止此设备或从属设备的所有其他事件。

启动守护进程或其他长时间运行的进程不适用于udev; 事件处理完成后,将无条件地终止分离或未分离的分叉进程。

所以,我创建了新的脚本来启动和disown具有sleep命令的脚本。 实际上,它确实有效!

 $ ls -l /sa* -rw-r--r-- 1 root root 1104 Oct 24 12:37 /saidhi -rwxr-xr-x 1 root root 29 Oct 24 12:31 /sayhi -rwxr-xr-x 1 root root 62 Oct 24 12:28 /sayhi2 $ cat /sayhi #!/bin/bash /sayhi2 & disown $ cat /sayhi2 #!/bin/bash sleep 30 date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi $ cat /etc/udev/rules.d/99-test.rules ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"