#!/system/bin/sh # USB 读卡器守护脚本 v5 - 仅针对 GL3224 读卡器 (VID:PID 05e3:0747) # 功能: ①应用稳定性调优 ②掉线自动恢复(3场景) # 安全: 仅当 USB 端口 2-1 上的设备 VID/PID 匹配时才干预, 其他设备完全不受影响 DEV_PATH="2-1" TARGET_VID="05e3" TARGET_PID="0747" LOGFILE="/data/local/tmp/usb_guard.log" AUTHORIZED="/sys/bus/usb/devices/${DEV_PATH}/authorized" BLKDEV="" LAST_HEALTH=0 TUNED=0 log() { echo "[$(date '+%F %T')] $1" >> "$LOGFILE"; } # 校验当前 2-1 口上的设备是否为目标读卡器 is_target() { [ "$(cat /sys/bus/usb/devices/${DEV_PATH}/idVendor 2>/dev/null)" = "$TARGET_VID" ] && \ [ "$(cat /sys/bus/usb/devices/${DEV_PATH}/idProduct 2>/dev/null)" = "$TARGET_PID" ] } # 动态解析该 USB 设备对应的块设备名 (如 sdg), 避免硬编码 find_blkdev() { for b in /sys/class/block/sd[a-z]; do target=$(readlink -f "$b" 2>/dev/null) case "$target" in *"${DEV_PATH}:1.0"*) echo "${b##*/}"; return 0 ;; esac done return 1 } apply_tuning() { [ -n "$BLKDEV" ] && [ -e "/sys/block/$BLKDEV" ] || return echo 120 > /sys/block/$BLKDEV/device/timeout 2>/dev/null echo 256 > /sys/block/$BLKDEV/queue/max_sectors_kb 2>/dev/null echo none > /sys/block/$BLKDEV/queue/scheduler 2>/dev/null TUNED=1 log "已应用调优参数 ($BLKDEV: timeout=120s, max_sectors=256KB, scheduler=none)" } recover() { log "$1 -> 执行重枚举..." echo 0 > "$AUTHORIZED" 2>/dev/null sleep 3 echo 1 > "$AUTHORIZED" 2>/dev/null sleep 7 if [ -f "$AUTHORIZED" ] && [ "$(cat "$AUTHORIZED" 2>/dev/null)" = "1" ]; then log "重枚举成功,设备恢复" TUNED=0 BLKDEV="" else log "重枚举失败,请手动检查" fi dmesg -c > /dev/null 2>&1 } log "守护脚本启动 v5 (目标: GL3224 05e3:0747)" while true; do if [ -f "$AUTHORIZED" ] && is_target; then # 解析块设备名 [ -z "$BLKDEV" ] && BLKDEV=$(find_blkdev) # 场景B: 异常断开 if [ "$(cat "$AUTHORIZED" 2>/dev/null)" = "0" ]; then recover "场景B: 设备异常断开" continue fi # 健康时确保调优参数 if [ "$TUNED" = "0" ] && [ -n "$BLKDEV" ]; then apply_tuning fi # 场景A: SCSI offline 日志 if dmesg 2>/dev/null | tail -30 | grep -q "device offline or changed"; then recover "场景A: 检测到设备假死" continue fi # 场景C: 健康探测 (每12秒, 读扇区0, 5秒超时) now=$(date +%s) if [ $((now - LAST_HEALTH)) -ge 12 ] && [ -n "$BLKDEV" ]; then LAST_HEALTH=$now if ! timeout 5 dd if="/dev/block/$BLKDEV" bs=512 count=1 of=/dev/null 2>/dev/null; then recover "场景C: 健康探测超时(静默假死)" continue fi fi else # 非目标设备: 完全旁观, 不做任何操作 sleep 10 fi sleep 2 done