我正在尝试使用 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!
!
是一个特殊字符,因此您需要引用包含它的字符串,否则它将被 shell 解释。 (前任。:echo '!Hello World!'
该脚本不会在交互式 shell 中运行
udev
,因此echo
文本不会出现在任何地方。如果您想确认脚本正在运行,请将其重定向到一个文件:(echo '!Hello World!' > /tmp/output_$(date +%s).txt
该$(date +%s)
部分在每次运行脚本时为文件提供唯一的名称)。
答案2
移动脚本来/home/michael
解决问题。我认为这与用户权限有关。
我在开发过程中使用终端作为根用户。像我一样运行命令可以/usr/bin
按预期工作。我假设 udev 以没有 root 权限的用户身份运行。