udev 规则在 USB 插入时未执行,应在后台运行脚本

udev 规则在 USB 插入时未执行,应在后台运行脚本

我编写了一个 udev 规则并将其放在 /etc/udev/rules/90-wifi.rules 中

ACTION=="add", SUBSYSTEM=="usb", DRIVER=="usb", RUN+="sh /usr/local/bin/setup_wifi_wrapper.sh"

它应该在每个插入的 USB 设备上运行。

它应该启动脚本 /usr/local/bin/setup_wifi_wrapper.sh

#!/bin/bash
/usr/local/bin/start_wifi.sh & disown

这应该启动 /usr/local/bin/start_wifi.sh

#!/bin/bash

sudo systemctl start hostapd
sudo ifup br0
sudo systemctl restart dnsmasq
touch /home/user/started

但事实并非如此... 这些脚本都是可执行的,我可以从命令行启动它们,它们会执行它们应该执行的操作。我尝试将它们放在不同的位置,从主文件夹启动并将它们移动到 usr/local/bin。使用 disown 为后台进程制作包装器,但仍然没有结果。有人有想法吗?

提前致谢

答案1

来自的udev手册页RUN

执行指定为指定值的外部程序。如果没有给出绝对路径,则程序应位于 中/lib/udev;否则,必须指定绝对路径。

sh不在/lib/udev

此外,从脚本开始,sh由 Sh 解释器运行。但是,从命令行可能没有给出解释器,因此该#!/bin/bash行将用于选择 Bash。

这是 Bash 特有的。因此,只需从规则的这一部分中disown删除前导即可:sh

RUN+="/usr/local/bin/setup_wifi_wrapper.sh"

答案2

更改 udev 规则

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

我会避免使用 RUN+ 键。

你的脚本

 #!/bin/sh
/bin/sleep 10 
systemctl start hostapd &&
ifup br0 &&
systemctl restart dnsmasq &&
touch /home/user/started

仅当每个命令都成功时,该序列才有效。

相关内容