#!/bin/bash # 查清 metrics 端口到底归哪个实例 —— 这是 watchdog 判定的基础,错不得。 set -u echo "════════ 1. 两个服务的完整配置(找 --metrics)════════" for svc in lanremote-tunnel lanremote-tunnel-h2; do echo " ── $svc ──" systemctl cat "$svc" 2>/dev/null | grep -A10 'ExecStart=' | sed 's/^/ /' echo done echo "════════ 2. 进程和端口的实时对应 ════════" for p in $(pgrep cloudflared); do cg=$(cat /proc/$p/cgroup 2>/dev/null | head -1) echo " ── pid $p ──" echo " 服务: $(basename "$cg" 2>/dev/null)" echo " 命令行: $(tr '\0' ' ' < /proc/$p/cmdline 2>/dev/null | grep -oE '\-\-protocol [a-z0-9]+|\-\-metrics [^ ]+|\-\-ha-connections [0-9]+' | tr '\n' ' ')" echo " 监听的端口:" ss -tlnp 2>/dev/null | grep "pid=$p" | awk '{print " " $4}' done echo echo "════════ 3. 每个端口报的实例特征 ════════" for port in 20241 20242 20243; do body=$(curl -s --max-time 4 "http://127.0.0.1:$port/metrics" 2>/dev/null) if [ -z "$body" ]; then echo " ── 端口 $port: 无响应 ──" continue fi conns=$(echo "$body" | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}') # 用协议特征区分:QUIC 实例的报告里会有 quic 相关指标 quic=$(echo "$body" | grep -ci 'quic') echo " ── 端口 $port: ha_connections=$conns quic相关指标行数=$quic ──" echo "$body" | grep -E 'server_locations.*1$' | sed 's/^/ /' done echo echo "════════ 4. 反复重启,看端口分配会不会变 ════════" echo " (这个很重要:watchdog 写死了 20241=主 20242=副," echo " 如果 cloudflared 是"谁先起谁拿 20241",那这个假设就不成立)" for round in 1 2 3; do echo " ── 第 $round 轮:先重启 h2,再重启主 ──" systemctl restart lanremote-tunnel-h2 sleep 8 systemctl restart lanremote-tunnel sleep 12 for p in $(pgrep cloudflared); do cg=$(cat /proc/$p/cgroup 2>/dev/null | head -1) svc=$(basename "$cg" 2>/dev/null) ports=$(ss -tlnp 2>/dev/null | grep "pid=$p" | awk '{print $4}' | tr '\n' ' ') echo " $svc -> ${ports:-(没绑端口)}" done done echo echo "════════ 5. 现在的状态 ════════" ss -tlnp 2>/dev/null | grep -E '2024[0-9]' | sed 's/^/ /'