#!/bin/bash # 精确测看门狗的重启路径。 # # 做法:把地址文件临时改成一个**肯定不通**的地址, # 连跑 3 次看门狗,看它会不会重启隧道、重启后能不能拿到新地址。 # 测完把状态恢复。 set -u RELAY_DIR=/root/lanremote-relay URL_FILE="$RELAY_DIR/public_url.txt" STATE="$RELAY_DIR/watchdog.state" REAL_URL=$(cat "$URL_FILE" 2>/dev/null || echo "") echo "===== 1. 真实地址 =====" echo " ${REAL_URL:-(无)}" echo echo "===== 2. 临时换成肯定不通的地址 =====" echo "https://this-host-does-not-exist-lanremote.invalid" > "$URL_FILE" echo 0 > "$STATE" cat "$URL_FILE" | sed 's/^/ /' echo echo "===== 3. 连跑 3 次看门狗(第 3 次应该触发重启)=====" BEFORE=$(systemctl show lanremote-tunnel -p NRestarts | cut -d= -f2) BEFORE_URL=$(cat "$URL_FILE" 2>/dev/null || echo "") echo " 重启前 NRestarts = $BEFORE" echo for i in 1 2 3; do echo " --- 第 $i 次 ---" systemctl start lanremote-watchdog.service sleep 8 tail -1 "$RELAY_DIR/watchdog.log" 2>/dev/null | sed 's/^/ /' done echo echo "===== 4. 等重启完成并拿到新地址 =====" sleep 50 AFTER=$(systemctl show lanremote-tunnel -p NRestarts | cut -d= -f2) echo " 重启后 NRestarts = $AFTER (之前 $BEFORE)" NEW_URL=$(cat "$URL_FILE" 2>/dev/null || echo "") echo " 新地址: ${NEW_URL:-(还没拿到)}" echo echo "===== 5. 判定 =====" # 注意:NRestarts 只统计 Restart=always 的**自动**重启, # 不含 systemctl restart 的手动重启。所以不能拿它判断。 # 该看的是:日志里有没有「连续 3 次不通」,以及地址有没有变。 if grep -q "连续 3 次不通" "$RELAY_DIR/watchdog.log" 2>/dev/null; then echo " ✓ 看门狗日志里有「连续 3 次不通 -> 重启隧道」" else echo " ✗ 日志里没看到触发重启" fi if [ -n "$NEW_URL" ] && [ "$NEW_URL" != "$BEFORE_URL" ]; then echo " ✓ 地址确实变了(说明隧道被重启并重新申请了地址)" else echo " ~ 地址没变" fi if [ -n "$NEW_URL" ] && [ "$NEW_URL" != "https://this-host-does-not-exist-lanremote.invalid" ]; then echo " ✓ 地址文件被 tunnel-run.sh 更新成了新地址" else echo " ⚠ 地址文件还是旧值" fi echo echo "===== 6. 新地址通不通 =====" if [ -n "$NEW_URL" ]; then OK=0 for i in 1 2 3 4 5; do C=$(timeout 20 curl -4 -s -o /dev/null -w '%{http_code}' \ "$NEW_URL/v1/health" 2>/dev/null) printf " 第 %d 次: HTTP %s\n" "$i" "${C:-超时}" [ "$C" = "200" ] && { OK=1; break; } sleep 8 done echo if [ "$OK" = "1" ]; then echo " ✓ 服务已恢复" echo "$NEW_URL" > "$URL_FILE" # 失败计数清零 echo 0 > "$STATE" echo echo " 当前可用地址: $NEW_URL" else echo " ✗ 还是不通(这条线路的问题,看门狗会继续重试)" fi fi