求助:连接条码扫描器时udev规则未触发,脚本无法运行
让我来帮你梳理下可能导致udev规则没触发脚本的几个常见原因,这些都是我踩过的坑:
规则语法的空格错误
看你的规则里写了RUN + = "/home/iuk323/authorun.sh",udev对语法的空格要求非常严格,操作符和值之间不能有空格!正确的写法应该是:KERNELS=="2-1.5", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/home/iuk323/authorun.sh"注意
RUN+=是连在一起的,没有空格,这是最容易犯的低级错误。设备匹配条件太局限
你用KERNELS=="2-1.5"是匹配特定的USB端口路径,但如果下次把扫描器插在其他USB口,这个值就会变,规则就失效了。建议改用更通用的匹配条件,比如从udevadm info的输出里找设备的idVendor和idProduct(通常在父设备信息里),比如:ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/home/iuk323/authorun.sh"这样不管插哪个USB口,只要是你的条码扫描器,规则都会触发。
udev规则未重新加载
你创建完新规则后,必须重新让udev加载规则,否则新规则不会生效。执行以下命令:sudo udevadm control --reload-rules sudo udevadm trigger然后拔插你的条码扫描器,再测试是否生效。
脚本的环境变量问题
udev运行脚本时的环境和你登录后的用户环境完全不同,很多系统路径(比如PATH)可能没有包含你需要的命令。所以脚本里所有的命令都要用绝对路径,比如脚本里如果要调用Python,得写/usr/bin/python3而不是python3。另外,udev无法运行需要交互的脚本,也不能直接启动GUI程序(如果需要启动GUI,得手动指定DISPLAY和XAUTHORITY变量,不过不建议这么做)。查看udev日志排查错误
如果上面的方法都没用,直接看系统日志找问题:journalctl -u systemd-udevd.service -f然后拔插设备,日志里会显示udev是否匹配到你的规则,以及脚本执行失败的具体原因(比如权限问题、脚本路径错误、脚本本身报错等)。
脚本权限与执行上下文
虽然你说脚本权限足够,但要确保脚本是可执行的:chmod +x /home/iuk323/authorun.sh另外,udev是用root用户运行脚本的,如果你的脚本需要操作用户目录下的文件,最好切换到对应用户执行,比如:
RUN+="/bin/su - iuk323 -c '/home/iuk323/authorun.sh'"避免root权限带来的文件权限问题。
内容的提问来源于stack exchange,提问作者Andre

