我试图使用udev检测USB附加事件,然后运行脚本。这方面的例子很多,但我似乎无法使它发挥作用。
我的脚本是/usr/bin/
是非常普通的usbattached.sh
!/bin/bash
echo !Hello World!
mkdir /media/usb_device
mount /dev/sda1 /media/usb_device
我在/etc/udev/rues.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调试和查看日志。我删除并添加我的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.
这意味着我的脚本正在运行,但是出错了。
发布于 2022-03-03 16:40:16
!/bin/bash
您的bash是畸形的(第一个字符应该是#
)。而且,udev
将只使用sh
运行脚本,而不使用bash
。您应该做的第一件事是将shebang修复为#!/bin/sh
。
echo !Hello World!
!
是一个特殊的字符,所以您需要引用包含它的字符串,否则它将被shell解释。(前:echo '!Hello World!'
)udev
不会在交互式shell中运行脚本,因此echo
'd文本不会出现在任何地方。如果要确认脚本正在运行,请将脚本重定向到一个文件:echo '!Hello World!' > /tmp/output_$(date +%s).txt
( $(date +%s)
部件在每次运行脚本时给文件一个唯一的名称)。发布于 2022-03-03 16:02:58
将脚本移动到/home/michael
解决了这个问题。我认为这与用户特权有关。
在开发过程中,我使用终端作为根。在/usr/bin
中运行命令,就像我在预期的那样工作。我假设udev是作为一个没有根权限的用户运行的。
https://unix.stackexchange.com/questions/692802
复制相似问题