#!/bin/bash # 独立的 30 次长轮询测试(task-3 第 3 项)。 # # 和长测里的那个区别:**注册带重试**。 # 长测里第一次注册正好撞上我重启隧道,失败一次就退出了 —— # 这里重试 6 次,避开这种瞬时抖动。 set -u BASE=https://relay.xxmxxs.top UA='LanRemote/1.8.2' N=${1:-30} OUT=/root/rp_poll30.tsv SUM=/root/rp_poll30_summary.txt cleanup() { local key key=$(cat /root/lanremote-relay/data/admin_key.txt 2>/dev/null) [ -n "${DEV:-}" ] && curl -s --max-time 20 -X POST \ "http://127.0.0.1:8080/v1/admin/delete" -H "X-Admin: $key" \ -H 'Content-Type: application/json' \ -d "{\"deviceId\":\"$DEV\"}" > /dev/null 2>&1 } trap cleanup EXIT echo "════════ 注册探针(最多试 6 次)════════" STAMP=$(date +%s) DEV="p30-${STAMP}" TOKEN="" for attempt in 1 2 3 4 5 6; do CODE=$(printf "%06d" $(( (STAMP + attempt * 7) % 1000000 ))) reg=$(curl -s --max-time 30 -X POST "$BASE/v1/agent/register" \ -H 'Content-Type: application/json' -H "User-Agent: $UA" \ -d "{\"deviceId\":\"$DEV\",\"code\":\"$CODE\",\"name\":\"p30\",\"version\":\"1.8.2\"}") TOKEN=$(echo "$reg" | python3 -c "import sys,json; print(json.load(sys.stdin).get('token',''))" 2>/dev/null) if [ -n "$TOKEN" ]; then echo " 第 $attempt 次成功(code=$CODE,token ${#TOKEN} 字符)" break fi echo " 第 $attempt 次失败: $(echo "$reg" | head -c 120)" sleep 4 done if [ -z "$TOKEN" ]; then echo " [失败] 6 次都没注册上,放弃" exit 1 fi echo echo "════════ 开始 $N 次长轮询(每次挂 60 秒,约 $((N)) 分钟)════════" rm -f "$OUT" ok=0; fail=0; fails="" T_START=$(date '+%Y-%m-%d %H:%M:%S') for i in $(seq 1 "$N"); do t0=$(date '+%H:%M:%S') out=$(curl -s -o /dev/null -w '%{http_code} %{time_total}' --max-time 130 \ -X POST "$BASE/v1/agent/poll" -H "X-Token: $TOKEN" -H "User-Agent: $UA") c=$(echo "$out" | awk '{print $1}') ms=$(echo "$out" | awk '{printf "%d", $2*1000}') if [ "$c" = "200" ]; then ok=$((ok+1)) printf " %2d: 200 %6dms\n" "$i" "$ms" else fail=$((fail+1)); fails="$fails ${i}:${c}" printf " %2d: %-4s **失败**\n" "$i" "$c" fi printf '%d\t%s\t%d\t%s\n' "$i" "$c" "$ms" "$t0" >> "$OUT" done T_END=$(date '+%Y-%m-%d %H:%M:%S') { echo "================================================================" echo " 长轮询测试 · $N 次" echo " 开始 $T_START 结束 $T_END" echo "================================================================" echo " 成功 $ok/$N = $((ok * 100 / N))%" echo " 失败:$fails" echo echo " 耗时分布(成功的):" awk -F'\t' '$2=="200" {print $3}' "$OUT" | sort -n | awk ' {a[NR]=$1} END { if (NR == 0) { print " 无数据"; exit } printf " 最小 %d P50 %d P90 %d P99 %d 最大 %d ms(理想 ≈ 61000)\n", a[1], a[int(NR/2)+1], a[int(NR*0.9)+1], a[int(NR*0.99)+1], a[NR] }' echo echo " 非 200 的样本:" awk -F'\t' '$2!="200" {print " #" $1 " 码=" $2 " 耗时=" $3 "ms 开始 " $4}' "$OUT" } | tee "$SUM"