/var/www/html/configWWW
当任何 USB 插入我的 Rasperry 时,我需要自动运行我的脚本。
UDEV 规则 -/etc/udev/rules.d/myRule.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="****",
ATTR{idProduct}=="****", RUN+="/var/www/html/configWWW"
我的剧本/var/www/html/configWWW
#!/bin/bash
file="/media/pi/`ls /media/pi`/SymSif.xml"
if [ -f "$file" ]
then
(
echo "it works: $(date)" >> /home/pi/Desktop/test.txt
)
else
(
echo "it does not works: $(date)" >> /home/pi/Desktop/test.txt
)
fi
另一方面,如果我从 bash 运行脚本bash /var/www/html/configWWW
,它就有效了!
为什么我的 udev 规则不像我的 bash 命令那样工作?
答案1
从 udev 运行脚本存在问题,当沙箱被丢弃时,几乎没有什么可以幸存(挂载、网络连接……)。第二个原因是,从 udev 运行的脚本将阻止此设备或相关设备的所有进一步事件,并最终超时,并且脚本启动的所有正在运行的进程将无条件终止。
您可以使用 systemd 获得相同的结果:
$ cat /etc/systemd/system/garmin.service
[Unit]
Description=Autorun actions for Garmin FR620
Requires=dev-disk-by\x2did-usb\x2dGarmin_FR620_Flash\x2d0:0.device
After=dev-disk-by\x2did-usb\x2dGarmin_FR620_Flash\x2d0:0.device
[Service]
ExecStart=/opt/bin/autorun_garmin_fr620.sh
[Install]
WantedBy=dev-disk-by\x2did-usb\x2dGarmin_FR620_Flash\x2d0:0.device
你可以通过连接你的设备并运行来找到你的 .device 单元systemctl --all list-units
不要忘记启用你的.service:
$ systemctl enable garmin.service
或者您可以从 udev 规则启动 systemd .service:
$ cat /etc/udev/rules.d/99-garmin-autorun.rules
# Start garmin FR620 systemd .service
ACTION=="add", \
KERNELS=="3-3", \
SUBSYSTEMS=="usb", \
ATTRS{idProduct}=="2657", \
ATTRS{idVendor}=="091e", \
TAG+="systemd", ENV{SYSTEMD_WANTS}="garmin.service"
...并且 systemd .service 可能看起来像这样:
[Unit]
Description=Autorun actions for Garmin FR620
[Service]
Type=oneshot
ExecStart=/opt/bin/autorun_garmin_fr620.sh
答案2
如果你能补充udevadm info -a ...
一下就更好了。无论如何,以下是我期望的几件事:
- 设置脚本可执行权限位。
- 将规则文件名更改为标准格式,例如
99-alpha.rules
- 检查
SUBSYSTEM
和之间SUBSYSTEMS
以及 和 之间的ATTR
区别ATTRS
。
看man udev