#!/bin/bash # 端到端验证 watchdog 的"单实例掉线"识别(真改配置,跑完立刻还原) set -u H2=/etc/systemd/system/lanremote-tunnel-h2.service BAK=/tmp/h2.bak.$(date +%s) cp -a "$H2" "$BAK" restore() { cp -a "$BAK" "$H2" systemctl daemon-reload systemctl restart lanremote-tunnel-h2 rm -f "$BAK" } trap restore EXIT echo "════════ 1. 把副实例的 --metrics 改成一个没人听的端口 ════════" sed -i 's#--metrics 127.0.0.1:20242#--metrics 127.0.0.1:20299#' "$H2" grep -oE '\-\-metrics [0-9.:]+' "$H2" | sed 's/^/ h2: /' systemctl daemon-reload systemctl restart lanremote-tunnel-h2 sleep 10 echo echo " 现在实际监听:" ss -tlnp 2>/dev/null | grep -E '2024[0-9]|20299' | sed 's/^/ /' echo echo "════════ 2. watchdog 预演(DRY_RUN=1,不会真重启)════════" echo " 期望:认出 lanremote-tunnel-h2 无响应,**只**重启它" DRY_RUN=1 bash /root/lanremote-relay/watchdog.sh 2>&1 | sed 's/^/ /' echo echo "════════ 3. 对照:不改配置时的预演(应该什么都不做)════════" restore sleep 20 echo " 实际监听:" ss -tlnp 2>/dev/null | grep -E '2024[0-9]' | sed 's/^/ /' echo " 预演:" DRY_RUN=1 bash /root/lanremote-relay/watchdog.sh 2>&1 | sed 's/^/ /' echo " (没输出 = 正常,符合预期)" echo echo "════════ 4. 最终状态 ════════" for p in $(pgrep cloudflared); do cg=$(cat /proc/$p/cgroup 2>/dev/null | head -1) svc=$(basename "$cg" 2>/dev/null | sed 's/\.service$//') port=$(ss -tlnp 2>/dev/null | grep "pid=$p" | grep -oE '2024[0-9]' | head -1) n=$(curl -s --max-time 4 "http://127.0.0.1:$port/metrics" 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') echo " $svc -> 端口 ${port:-?} 连接 ${n:-?}" done