93 lines
3.0 KiB
Bash
Executable File
93 lines
3.0 KiB
Bash
Executable File
#!/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
|