Ubuntu Server 21.10 插入USB设备时自动执行Shell脚本失败求助
问题排查与解决步骤
核心问题点
- 通配符使用错误:udev规则里匹配任意值使用单个
*即可,你写的****额外加了反引号和多余的星号,属于无效规则,完全无法匹配设备 - 规则文件选择错误:
/etc/udev/rules.d/70-snap.snapd.rules是snap服务自动管理的文件,后续snap更新时会被覆盖,不建议用来写自定义规则 - 脚本没有使用绝对路径:udev的执行环境没有完整的系统PATH变量,直接写
netplan命令会因为找不到执行文件而失败 - 规则生效方式不完整:只重启udev服务不会重新触发已有设备的规则加载,需要额外执行重载规则命令
步骤1:修正脚本内容
修改/home/update.sh内容如下,增加日志便于排查,同时补全命令绝对路径:
#!/bin/sh # 写入执行日志 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到USB插入,执行netplan apply" >> /var/log/usb-trigger.log # 补全netplan绝对路径,可执行`which netplan`确认你环境的实际路径 /usr/sbin/netplan apply
确认脚本可执行权限,之前已经执行过chmod +x /home/update.sh无需重复操作。
步骤2:新建独立udev规则文件
先将之前添加到70-snap.snapd.rules里的自定义规则删除,恢复原文件内容,再新建/etc/udev/rules.d/99-usb-trigger.rules文件,写入以下规则:
# 匹配所有USB设备插入事件,执行指定脚本 ACTION=="add", SUBSYSTEM=="usb", RUN+="/home/update.sh"
如果你需要限定只匹配特定USB设备,可以查询对应设备的idVendor和idProduct后,添加对应条件:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="xxxx", RUN+="/home/update.sh"
步骤3:重载udev规则使其生效
执行以下命令重载规则,无需重启系统:
sudo udevadm control --reload-rules sudo udevadm trigger
步骤4:测试验证
插入USB设备后,查看/var/log/usb-trigger.log是否有对应的日志记录,确认netplan apply是否正常执行。如果没有日志生成,可以查看/var/log/syslog中udev相关的报错信息进一步排查。
另外你日志里出现的蓝牙规则报错是树莓派Ubuntu 21.10的已知问题,和本次USB规则不生效无关,不需要处理。
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

