我遇到了 udev 规则未运行的问题。下面是一个例子:
我有一个规则/etc/udev/rules.d/99-test.rules
,其中包含:
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"
Run Code Online (Sandbox Code Playgroud)
并且sayhi
只有:
#!/bin/bash
date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi
Run Code Online (Sandbox Code Playgroud)
这是一台英特尔机器,我显然有许多供应商 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 ]
Run Code Online (Sandbox Code Playgroud)
然而,当我启动时,/saidhi
要么根本不创建,要么里面有 1 或 2 个日期行。
如果在启动后,我运行udevadm trigger --action=add --subsystem-match=pci
然后 /saidhi
将获得添加到它的正确数量的日期。
为什么这在启动过程中不起作用?
我无法让 udev 运行的脚本在 USB 插入时在后台运行。
我的 udev 规则似乎有效,因为它肯定会调用脚本,但是无论我做什么,我都无法让 bash 脚本在后台运行,因此它会阻塞。
ATTRS{idVendor}=="125f", ATTRS{idProduct}=="db8a", SYMLINK+="usb/adata%n", ENV{XAUTHORITY}="/home/abe/.Xauthority", ENV{DISPLAY}=":0", OWNER="abe", RUN+="/home/abe/bin/usb-adata_udev.sh"
#!/bin/bash
if [[ $ACTION == "add" ]]; then
# I've tried many variations on this, none seem to work
(su abe /bin/bash -c "/home/abe/Documents/Programs/USB\ Sync/usb-in.sh") &
fi
if [[ $ACTION == "remove" ]]; then
/home/abe/Documents/Programs/USB\ Sync/usb-out.sh &
fi
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
#echo $ACTION > "/home/abe/Desktop/test.txt"
if [[ ! -d "/media/abe/ABE" ]]; then
# for testing
sleep 10 …
Run Code Online (Sandbox Code Playgroud)