Udev 规则运行,脚本失败

Udev 规则运行,脚本失败

我正在尝试使用 udev 检测 USB 连接事件然后运行脚本。有很多这样的例子,但我似乎无法让它发挥作用。

我的脚本/usr/bin/很简单usbattached.sh

!/bin/bash

echo !Hello World!
mkdir /media/usb_device
mount /dev/sda1 /media/usb_device

我在 /etc/udev/rules.d 中的规则也很简单usbconnected.rules

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0243", RUN+="/bin/usbattached.sh"

我已经重置设备很多次了,希望 udev 能够更新。到目前为止还没有。我还尝试运行命令来刷新规则,但没有成功。

udevadm control --reload-rules && udevadm trigger

我的规则/脚本有问题吗?

将我的 USB 插入我的设备,我得到输出

root@imx6ull14x14evk:/usr/bin# [  344.348033] usb 1-1: USB disconnect, device number 2
[  347.572148] usb 1-1: new high-speed USB device number 3 using ci_hdrc
[  347.796563] usb 1-1: New USB device found, idVendor=18a5, idProduct=0243, bcdDevice= 0.02
[  347.805120] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  347.820492] usb 1-1: Product: STORE N GO
[  347.829885] usb 1-1: Manufacturer: Verbatim
[  347.839204] usb 1-1: SerialNumber: 12050602000042
[  347.864925] usb-storage 1-1:1.0: USB Mass Storage device detected

编辑:我确实给了我的脚本可执行权限chmod +x usbattached.sh

编辑 2:打开 udev 调试并观看 journctl。我删除并添加我的 USB 设备。我在日志中看到

Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: /etc/udev/rules.d/usbconnected.rules:1 RUN '/bin/usbattached.sh
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Running command "/bin/usbattached.sh"
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Starting '/bin/usbattached.sh'
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: Successfully forked off '(spawn)' as PID 275.
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Process '/bin/usbattached.sh' failed with exit code 1.
Mar 03 15:44:00 imx6ull14x14evk systemd-udevd[270]: 1-1: Command "/bin/usbattached.sh" returned 1 (error), ignoring.

这意味着我的脚本正在运行,但出错了。

答案1

!/bin/bash

您的 bash shebang 格式错误(第一个字符应该是#)。另外,udev只会运行带有sh,而不是 的脚本bash。您应该做的第一件事是将 shebang 修复为#!/bin/sh.

echo !Hello World!

  1. !是一个特殊字符,因此您需要引用包含它的字符串,否则它将被 shell 解释。 (前任。:echo '!Hello World!'

  2. 该脚本不会在交互式 shell 中运行udev,因此echo文本不会出现在任何地方。如果您想确认脚本正在运行,请将其重定向到一个文件:(echo '!Hello World!' > /tmp/output_$(date +%s).txt$(date +%s)部分在每次运行脚本时为文件提供唯一的名称)。

答案2

移动脚本来/home/michael解决问题。我认为这与用户权限有关。

我在开发过程中使用终端作为根用户。像我一样运行命令可以/usr/bin按预期工作。我假设 udev 以没有 root 权限的用户身份运行。

相关内容