#!/bin/bash # 验证自适应阈值: # 连接健康 + 公网不通 -> 要连着失败 8 次才重启(别把抖动升级成中断) # 连接降级 + 公网不通 -> 3 次就重启 set -u SRC=/tmp/wd_v4.sh echo "════════ 0. 语法检查 ════════" bash -n "$SRC" && echo " ✓ 语法 OK" || { echo " ✗ 语法错"; exit 1; } setup() { rm -rf /tmp/wdtest2 mkdir -p /tmp/wdtest2/relay /tmp/wdtest2/bin sed -e 's#^RELAY_DIR=.*#RELAY_DIR=/tmp/wdtest2/relay#' \ -e 's#^URL_FILE=.*#URL_FILE=/tmp/wdtest2/relay/public_url.txt#' \ -e 's#^STATE_FILE=.*#STATE_FILE=/tmp/wdtest2/relay/watchdog.state#' \ -e 's#^LAST_RESTART_FILE=.*#LAST_RESTART_FILE=/tmp/wdtest2/relay/watchdog.last_restart#' \ -e 's#^TUNNEL_LOGS=.*#TUNNEL_LOGS=("/tmp/wdtest2/relay/t1.log")#' \ "$SRC" > /tmp/wdtest2/wd.sh echo "https://relay.example" > /tmp/wdtest2/relay/public_url.txt touch /tmp/wdtest2/relay/t1.log printf '#!/bin/bash\nexit 0\n' > /tmp/wdtest2/bin/logger # systemctl 桩:restart 会写一行标记,方便判断有没有真重启 cat > /tmp/wdtest2/bin/systemctl <<'EOF' #!/bin/bash if [ "$1" = "restart" ]; then echo "RESTARTED:$2"; exit 0; fi exit 0 EOF chmod +x /tmp/wdtest2/bin/* } # 连续运行 N 次,返回"第几次触发了重启" run_series() { local label="$1" conns="$2" health="$3" times="$4" setup echo " ── $label(连接=$conns 公网=$health,连跑 $times 次)──" local i triggered="" for i in $(seq 1 "$times"); do cat > /tmp/wdtest2/bin/curl <&1) if echo "$out" | grep -q 'DRY_RUN.*本应重启'; then triggered="$i" echo " 第 $i 次触发重启: $(echo "$out" | grep 'DRY_RUN' | sed 's/.*\] //')" break fi # 显示中间状态 echo "$out" | grep -E '再等等|连续第' | tail -1 | sed "s/^/ 第 $i 次: /" done [ -z "$triggered" ] && echo " $times 次内没有触发重启" echo } echo "════════ 1. 连接健康 + 公网一直不通 ════════" echo " 期望:撑到第 8 次才重启(THRESHOLD_HEALTHY=8)" run_series "健康连接" 5 000 10 echo "════════ 2. 连接降级(0 条)+ 公网不通 ════════" echo " 期望:第 1 次就该重启(连接为 0 = 确认故障,立刻重启)" run_series "零连接" 0 000 6 echo "════════ 3. 连接只有 1 条 + 公网不通 ════════" echo " 期望:降级计数起作用,3 次左右重启" run_series "1 条连接" 1 000 6 echo "════════ 4. 对照:连接健康 + 公网正常 ════════" echo " 期望:永远不重启" run_series "健康且公网通" 5 200 5