#!/bin/bash # 部署双实例版 watchdog(带预演和备份) set -u RELAY=/root/lanremote-relay STAMP=$(date +%s) echo "════════ 1. 备份现在的 watchdog ════════" cp -a "$RELAY/watchdog.sh" "$RELAY/watchdog.sh.bak.$STAMP" cp -a "$RELAY/watchdog.state" "$RELAY/watchdog.state.bak.$STAMP" 2>/dev/null || true echo " $RELAY/watchdog.sh.bak.$STAMP" echo " 旧版行数: $(wc -l < "$RELAY/watchdog.sh")" echo echo "════════ 2. 装新版 ════════" install -m 755 /tmp/wd_v4.sh "$RELAY/watchdog.sh" echo " 新版行数: $(wc -l < "$RELAY/watchdog.sh")" bash -n "$RELAY/watchdog.sh" && echo " 语法 OK" echo echo "════════ 3. 预演(DRY_RUN=1,不会真重启)════════" echo " 当前实际状态:" for p in 20241 20242; do n=$(curl -s --max-time 4 http://127.0.0.1:$p/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') echo " 端口 $p: ${n:-无响应}" done echo " 预演输出:" DRY_RUN=1 bash "$RELAY/watchdog.sh" 2>&1 | sed 's/^/ /' echo echo "════════ 4. 真跑一次(当前一切正常,应该什么都不做)════════" bash "$RELAY/watchdog.sh" 2>&1 | sed 's/^/ /' echo " 退出码: $?" echo echo "════════ 5. 状态文件 ════════" cat "$RELAY/watchdog.state" 2>/dev/null | sed 's/^/ /' echo echo "════════ 6. 确认 timer 还在跑 ════════" systemctl is-active lanremote-watchdog.timer | sed 's/^/ timer: /' systemctl list-timers lanremote-watchdog.timer --no-pager 2>/dev/null | head -3 | sed 's/^/ /' echo echo "════════ 7. 等一轮 timer 触发,看日志 ════════" sleep 30 tail -6 "$RELAY/watchdog.log" | sed 's/^/ /' echo echo " 备份路径: $RELAY/watchdog.sh.bak.$STAMP"