如果我使用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
但是我从来没有检查过,也不知道这是否会按预期工作(我不是脚本专家)。
正如其他人所提到的, udev
的RUN=
指令启动的进程应该是短期运行的 。 我想建议另一种更简单的方法,通过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"