“重启” USB 控制器的驱动,解决 USB 设备识别异常、连接不稳定等问题
#!/bin/bash
# 优化版:USB控制器驱动重启脚本(带日志、错误处理)
# 定义日志文件
LOG_FILE="/var/log/usb_reset.log"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始重启USB控制器驱动..." >> $LOG_FILE
# 提取USB控制器类型(ohci/ehci/xhci)
hubs=($(lspci | grep USB | egrep -o "(OHCI|EHCI|xHCI)" | tr 'A-Z' 'a-z' | awk '{printf"%s ",$1}'))
# 检查是否找到USB控制器
if [ ${#hubs[@]} -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 未找到USB控制器,脚本退出" >> $LOG_FILE
exit 0
fi
# 遍历每个控制器类型
for hub in ${hubs[@]}; do
DRV_DIR="/sys/bus/pci/drivers/${hub}_hcd"
# 检查驱动目录是否存在
if [ ! -d "$DRV_DIR" ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 驱动目录 $DRV_DIR 不存在,跳过" >> $LOG_FILE
continue
fi
# 提取设备ID
dids=($(find "$DRV_DIR" -type l | egrep "/([0-9]+:){1,}" | awk -F'/' '{printf"%s ",$NF}'))
if [ ${#dids[@]} -eq 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 控制器 $hub 下无绑定设备,跳过" >> $LOG_FILE
continue
fi
# 解绑并重新绑定每个设备
for did in ${dids[@]}; do
[ -z "$did" ] && continue
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 处理设备 $did(控制器:$hub)" >> $LOG_FILE
# 解绑设备(捕获错误)
if ! echo "$did" > "$DRV_DIR/unbind"; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 设备 $did 解绑失败!" >> $LOG_FILE
continue
fi
# 重新绑定设备(捕获错误)
if ! echo "$did" > "$DRV_DIR/bind"; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 设备 $did 重新绑定失败!" >> $LOG_FILE
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 设备 $did 重启成功" >> $LOG_FILE
fi
done
done
echo "[$(date +'%Y-%m-%d %H:%M:%S')] USB控制器驱动重启脚本执行完成" >> $LOG_FILE
Categories:
系统运维