# -*- coding: utf-8 -*- """给看门狗加"最小重启间隔",防止链路成片抖动时反复重启。 观察到的现象: 链路差的时候,看门狗每隔 ~40 秒就重启一次隧道。 而每次重启之后 cloudflared 要重新建连接、约 30~90 秒才稳。 频繁重启反而让它永远处在"正在重连"的状态,得不偿失。 调整: THRESHOLD 2 -> 3 连续 3 次(约 60 秒)才认定真出问题。 短抖动(<1 分钟)交给 cloudflared 自己重连。 MIN_RESTART_GAP = 120 两次重启之间至少隔 2 分钟, 免得抖起来没完没了地重启。 """ from __future__ import annotations import sys from pathlib import Path WATCHDOG = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\relay" r"\watchdog.sh") OLD = '''THRESHOLD=2 # 连续几次就重启 STALE_MINUTES=10 # 日志多久没动静算卡死''' NEW = '''# 连续几次公网不通才重启。 # 设 3(约 60 秒)而不是 2:短抖动让 cloudflared 自己重连就好, # 频繁重启反而让它一直停在"正在重连"的状态。 THRESHOLD=3 STALE_MINUTES=10 # 日志多久没动静算卡死 # 两次重启之间至少隔这么久(秒)。 # 链路成片抖动时,这个能防止"重启 -> 刚好 -> 又抖 -> 再重启"的死循环。 MIN_RESTART_GAP=120''' RESTART_OLD = '''restart_tunnel() { local why="$1" log "$why —— 重启隧道" systemctl restart lanremote-tunnel write_state 0 0 sleep 25 log "重启后地址: $(cat "$URL_FILE" 2>/dev/null || echo '(还没拿到)')" exit 0 }''' RESTART_NEW = '''LAST_RESTART_FILE="$RELAY_DIR/watchdog.last_restart" restart_tunnel() { local why="$1" local now last gap now=$(date +%s) last=0 [ -f "$LAST_RESTART_FILE" ] && last=$(cat "$LAST_RESTART_FILE" 2>/dev/null || echo 0) gap=$((now - last)) if [ "$gap" -lt "$MIN_RESTART_GAP" ]; then # 刚重启过还没到间隔:这次先不重启, # 让 cloudflared 自己把连接建起来(它本来就在重试)。 log "$why —— 但距上次重启才 ${gap} 秒(下限 ${MIN_RESTART_GAP} 秒),先不重启" write_state 0 0 exit 0 fi log "$why —— 重启隧道(距上次 ${gap} 秒)" echo "$now" > "$LAST_RESTART_FILE" systemctl restart lanremote-tunnel write_state 0 0 sleep 25 log "重启后地址: $(cat "$URL_FILE" 2>/dev/null || echo '(还没拿到)')" exit 0 }''' def main() -> int: text = WATCHDOG.read_text(encoding="utf-8") ok = True if "MIN_RESTART_GAP" in text: print(" 已经加过重启间隔") else: for old, new, tag in ((OLD, NEW, "阈值和间隔常量"), (RESTART_OLD, RESTART_NEW, "重启函数加间隔判断")): if old in text: text = text.replace(old, new, 1) print(f" {tag}") else: print(f" [失败] {tag} —— 锚点没找到") ok = False WATCHDOG.write_text(text, encoding="utf-8", newline="\n") raw = WATCHDOG.read_bytes() if b"\r\n" in raw: WATCHDOG.write_bytes(raw.replace(b"\r\n", b"\n")) print(" 顺手修了 CRLF") return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())