Linux重新绑定服务器的 USB 控制器驱动 bash shell脚本

“重启” 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: 系统运维