树莓派3B+通过cron定时控制USB端口通断的脚本运行报错排查
报错根因定位
你当前遇到的tee: /sys/bus/usb/drivers/usb/unbind: No such device报错,核心原因如下:
- 尝试执行unbind操作的USB节点
1-1本来就已经处于解绑断开状态,大概率是之前手动执行过关闭USB的命令,系统里已经不存在这个绑定节点,自然会抛出无对应设备的错误 - 脚本逻辑和文件名不匹配:命名为
usb-on.sh的脚本实际写的是关闭USB的unbind命令,功能完全错位 - 脚本末尾残留了一个多余的反引号字符,会造成shell解析异常
- 已经用sudo提权执行全脚本的情况下,管道内嵌套sudo会造成sysfs路径解析异常
修复步骤
1. 先确认实际USB节点名称
不要硬套网上的通用节点名,先执行命令查看当前系统里的USB绑定节点:ls /sys/bus/usb/drivers/usb/ | grep -E '^[0-9]-[0-9.]+$'
如果输出的节点不是1-1(比如实际是1-1.1这类带后缀的名称),后续所有脚本里的节点名称要替换成你实际查到的值。
2. 重写带状态判断的双脚本
规避无意义的状态操作报错,分别对应开启、关闭USB的功能:
开启USB脚本(usb-on.sh)
#! /bin/sh # 开启USB端口供蜂窝dongle通信 USB_NODE="1-1" # 仅当节点未绑定(USB处于关闭状态)时执行bind操作 if [ ! -d "/sys/bus/usb/drivers/usb/$USB_NODE" ]; then echo "$USB_NODE" > /sys/bus/usb/drivers/usb/bind # 预留2秒等待USB dongle完成硬件初始化 sleep 2 echo "USB端口已开启" else echo "USB端口已处于开启状态,无需重复操作" fi
关闭USB脚本(usb-off.sh)
#! /bin/sh # 关闭USB端口降低待机功耗 USB_NODE="1-1" # 仅当节点处于绑定状态(USB处于开启状态)时执行unbind操作 if [ -d "/sys/bus/usb/drivers/usb/$USB_NODE" ]; then echo "$USB_NODE" > /sys/bus/usb/drivers/usb/unbind echo "USB端口已关闭" else echo "USB端口已处于关闭状态,无需重复操作" fi
3. 基础配置校验
- 给两个脚本加可执行权限:
chmod +x /home/pi/usb-on.sh /home/pi/usb-off.sh - 测试执行时直接用root权限运行脚本即可,不需要在脚本内部的命令再嵌套sudo
- 注意:树莓派3B+的板载以太网控制器与USB端口共享同一套内部USB通路,执行unbind操作会同时切断板载以太网连接,如果你的远程管理依赖板载以太网,需要提前确认蜂窝dongle的通信链路优先级,避免执行关闭命令后设备彻底断连
Crontab定时调度配置
因为操作sysfs节点需要root权限,直接编辑root用户的crontab规则,不要使用普通用户的crontab:sudo crontab -e
参考定时逻辑:每小时整点开启USB供dongle上传照片,等待3分钟传输完成后自动关闭USB降低功耗
# 每小时整点开启USB端口 0 * * * * /home/pi/usb-on.sh # 每小时过3分钟关闭USB端口 3 * * * * /home/pi/usb-off.sh
注意所有脚本路径要写绝对路径,避免crontab环境下找不到脚本文件。
内容的提问来源于stack exchange,提问作者Dave Rad
相关产品推荐
相关产品推荐

