为什么我的 udev 规则不起作用?

为什么我的 udev 规则不起作用?

/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

相关内容