我编写了一个 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
仅当每个命令都成功时,该序列才有效。