Files
OmniSocketGo/scripts/BACDauto_test.sh
2026-03-30 21:45:04 +08:00

296 lines
8.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
LOCAL_REPO_DIR="/home/limingjie/LMJ_Work/RobotCompetition/OmniSocketGo"
KCP_PEER_BIN="./bin/kcppeer"
OUTPUT_ROOT="/home/limingjie/LMJ_Work/RobotCompetition/KCPData/BDAClogs"
PEERB_POLL_INTERVAL_SEC=5
PEERB_MAX_POLLS=180
PEER_A_EXIT_WAIT_SEC=5
require_local_binary() {
if [ ! -x "$1" ]; then
echo "ERROR: 缺少可执行文件 $1"
exit 1
fi
}
cleanup_remote_peerb() {
ssh omni-peer bash -s <<'EOF'
pids=$(ps -eo pid=,args= | awk '/[b]in\/kcppeer -id peer-b/ {print $1}')
if [ -n "$pids" ]; then
kill $pids 2>/dev/null || true
fi
pids=$(ps -eo pid=,args= | awk '/\/tmp\/peerb_batch\.sh/ {print $1}')
if [ -n "$pids" ]; then
kill $pids 2>/dev/null || true
fi
rm -f /tmp/peerb_batch_done /tmp/peerb_batch.sh /tmp/peerb_commands
EOF
}
echo "=== 开始自动化测试 ==="
cd "$LOCAL_REPO_DIR"
require_local_binary "$KCP_PEER_BIN"
echo ">>> 0. 清理上次残留进程..."
pkill -f 'bin/kcppeer -id peer-a' 2>/dev/null || true
cleanup_remote_peerb || exit 1
rm -rf logs
rm -rf inbox/a
mkdir -p logs inbox/a
# 1. 清理残留 & 启动 Server D 和 Relay C
echo ">>> 1. 启动 Server D 和 Relay C..."
ssh bj-txy bash -s <<'EOF'
pkill -f kcpserver 2>/dev/null || true
pkill -f 'bin/kcpserver' 2>/dev/null || true
sleep 1
cd /home/ubuntu/OmniSocketGo
rm -rf logs
mkdir -p logs
if [ ! -x ./bin/kcpserver ]; then
echo "ERROR: 缺少 ./bin/kcpserver"
exit 1
fi
setsid ./bin/kcpserver -listen 0.0.0.0:10909 \
-kcp-ts-debug-log logs/d-kcp-ts.jsonl \
-kcp-session-stats-log logs/d-kcp-stats.jsonl > server_console.log 2>&1 </dev/null &
echo "server D launched (pid=$!)"
EOF
ssh sz-txy bash -s <<'EOF'
pkill -f kcpserver 2>/dev/null || true
pkill -f 'bin/kcpserver' 2>/dev/null || true
sleep 1
cd /home/ubuntu/OmniSocketGo
rm -rf logs
mkdir -p logs
if [ ! -x ./bin/kcpserver ]; then
echo "ERROR: 缺少 ./bin/kcpserver"
exit 1
fi
setsid ./bin/kcpserver -mode=relay -listen 0.0.0.0:10909 -relay-remote 172.21.32.15:10909 > relay_console.log 2>&1 </dev/null &
echo "relay C launched (pid=$!)"
EOF
# 等待 server D 端口就绪
echo " 等待 Server D 端口就绪..."
for i in $(seq 1 60); do
if ssh bj-txy "ss -ulnp | grep -q 10909" 2>/dev/null; then
echo " Server D 就绪 (${i}s)"
break
fi
if [ "$i" -eq 60 ]; then
echo " ERROR: Server D 60s 内未就绪,退出"
exit 1
fi
sleep 1
done
# 等待 relay C 端口就绪
echo " 等待 Relay C 端口就绪..."
for i in $(seq 1 60); do
if ssh sz-txy "ss -ulnp | grep -q 10909" 2>/dev/null; then
echo " Relay C 就绪 (${i}s)"
break
fi
if [ "$i" -eq 60 ]; then
echo " ERROR: Relay C 60s 内未就绪,退出"
exit 1
fi
sleep 1
done
# 2. 启动本地 Peer-A
echo ">>> 2. 启动本地 Peer-A..."
PEER_A_CMD_FIFO="/tmp/peera_commands_$$"
rm -f "$PEER_A_CMD_FIFO"
mkfifo "$PEER_A_CMD_FIFO"
nohup "$KCP_PEER_BIN" \
-id peer-a \
-server 172.21.32.15:10909 \
-relay-via 106.55.173.235:10909 \
-inbox-dir inbox/a \
-latency-log logs/a-latency.jsonl \
-kcp-ts-debug-log logs/a-kcp-ts.jsonl \
-kcp-session-stats-log logs/a-kcp-stats.jsonl \
< "$PEER_A_CMD_FIFO" > logs/peera_console.log 2>&1 &
PEER_A_PID=$!
exec 4>"$PEER_A_CMD_FIFO"
# 等待 peer-a 注册成功
echo " 等待 Peer-A 注册..."
for i in $(seq 1 30); do
if grep -Eq "opened KCP session as peer-a|connected to .* as peer-a( \\(KCP\\))?" logs/peera_console.log 2>/dev/null; then
echo " Peer-A 就绪 (${i}s)"
break
fi
if [ "$i" -eq 30 ]; then
echo " WARNING: Peer-A 30s 内未就绪"
fi
sleep 1
done
# 3. 在远端后台启动 peer-b 整个发送流程,不依赖长 SSH 连接
echo ">>> 3. 启动远端 Peer-B 并执行 50 轮打流测试..."
ssh omni-peer "cd /home/boll/LMJWork/OmniSocketGo && rm -rf logs inbox/b && mkdir -p logs inbox/b"
PEERB_DONE_FLAG="/tmp/peerb_batch_done"
PEERB_BATCH_SCRIPT="/tmp/peerb_batch.sh"
# 把整个发送脚本写到远端setsid 后台执行
ssh omni-peer bash -s <<'DEPLOY_SCRIPT'
DONE_FLAG="/tmp/peerb_batch_done"
BATCH_SCRIPT="/tmp/peerb_batch.sh"
rm -f "$DONE_FLAG"
cat > "$BATCH_SCRIPT" <<'INNER_EOF'
#!/bin/bash
cd /home/boll/LMJWork/OmniSocketGo
CMD_FIFO=/tmp/peerb_commands
DONE_FLAG="/tmp/peerb_batch_done"
STATUS="error"
rm -f "$CMD_FIFO" "$DONE_FLAG"
mkfifo "$CMD_FIFO"
finish() {
local status_to_write="$STATUS"
rm -f "$CMD_FIFO"
printf '%s\n' "$status_to_write" > "$DONE_FLAG"
}
trap finish EXIT
if [ ! -x ./bin/kcppeer ]; then
echo "ERROR: 缺少 ./bin/kcppeer" > logs/peerb_console.log
exit 1
fi
# 启动 peer-b
./bin/kcppeer \
-id peer-b \
-server 81.70.156.140:10909 \
-inbox-dir inbox/b \
-latency-log logs/b-latency.jsonl \
-kcp-ts-debug-log logs/b-kcp-ts.jsonl \
-kcp-session-stats-log logs/b-kcp-stats.jsonl \
< "$CMD_FIFO" > logs/peerb_console.log 2>&1 &
PEER_B_PID=$!
exec 3>"$CMD_FIFO"
# 等 peer-b 就绪
for i in $(seq 1 60); do
if grep -Eq "opened KCP session as peer-b|connected to .* as peer-b( \\(KCP\\))?" logs/peerb_console.log 2>/dev/null; then
break
fi
sleep 1
done
# 50 轮发送
for i in $(seq 1 50); do
echo "file peer-a /tmp/test30k.bin" >&3
sleep 1
echo "file peer-a /tmp/test5.bin" >&3
sleep 1
done
sleep 5
echo "quit" >&3 || true
exec 3>&-
peer_b_exited=0
for i in $(seq 1 15); do
if ! kill -0 $PEER_B_PID 2>/dev/null; then
peer_b_exited=1
break
fi
sleep 1
done
if [ "$peer_b_exited" -eq 0 ]; then
kill $PEER_B_PID 2>/dev/null || true
sleep 1
fi
if kill -0 $PEER_B_PID 2>/dev/null; then
kill -9 $PEER_B_PID 2>/dev/null || true
fi
wait $PEER_B_PID 2>/dev/null || true
# 写完成标记
STATUS="done"
INNER_EOF
chmod +x "$BATCH_SCRIPT"
setsid bash "$BATCH_SCRIPT" </dev/null >/dev/null 2>&1 &
echo "peer-b batch launched in background"
DEPLOY_SCRIPT
# 本地轮询等待远端完成(短 SSH 连接,不怕断开)
echo " 等待 peer-b 发送完成(预计 ~110 秒)..."
for i in $(seq 1 "$PEERB_MAX_POLLS"); do
PEERB_STATUS=$(ssh omni-peer "cat /tmp/peerb_batch_done 2>/dev/null || true")
if [ "$PEERB_STATUS" = "done" ]; then
ELAPSED_SEC=$(( (i - 1) * PEERB_POLL_INTERVAL_SEC ))
echo " peer-b 发送完成(约 ${ELAPSED_SEC}s"
break
fi
if [ "$PEERB_STATUS" = "error" ]; then
echo " ERROR: peer-b 后台任务启动失败,请检查远端 logs/peerb_console.log"
exit 1
fi
if [ "$i" -eq "$PEERB_MAX_POLLS" ]; then
echo " ERROR: peer-b $((PEERB_MAX_POLLS * PEERB_POLL_INTERVAL_SEC))s 内未完成"
exit 1
fi
# 每 5 秒查一次,减少 SSH 连接频率
sleep "$PEERB_POLL_INTERVAL_SEC"
done
# 4. 清理
echo ">>> 4. 清理所有进程..."
sleep 2
echo "quit" >&4 || true
exec 4>&-
for i in $(seq 1 "$PEER_A_EXIT_WAIT_SEC"); do
if ! kill -0 "$PEER_A_PID" 2>/dev/null; then
break
fi
sleep 1
done
if kill -0 "$PEER_A_PID" 2>/dev/null; then
kill "$PEER_A_PID" 2>/dev/null || true
fi
wait "$PEER_A_PID" 2>/dev/null || true
rm -f "$PEER_A_CMD_FIFO"
ssh bj-txy "pkill -f kcpserver || true; pkill -f 'bin/kcpserver' || true"
ssh sz-txy "pkill -f kcpserver || true; pkill -f 'bin/kcpserver' || true"
# 获取当前时间戳,格式为 YYYYMMDD_HHMMSS
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
OUTPUT_DIR="$OUTPUT_ROOT/$TIMESTAMP"
# 5. 拉取数据 & 生成报告
echo ">>> 5. 拉取数据并生成汇总报告..."
mkdir -p "$OUTPUT_DIR"
scp -o ServerAliveInterval=15 -P 10022 boll@175.178.116.187:/home/boll/LMJWork/OmniSocketGo/logs/b-latency.jsonl "$LOCAL_REPO_DIR/logs/b-latency.jsonl" || exit 1
(cd "$LOCAL_REPO_DIR/go" && go run ./cmd/latencysummary \
-input /home/limingjie/LMJ_Work/RobotCompetition/OmniSocketGo/logs/a-latency.jsonl \
-input /home/limingjie/LMJ_Work/RobotCompetition/OmniSocketGo/logs/b-latency.jsonl \
-output /home/limingjie/LMJ_Work/RobotCompetition/OmniSocketGo/logs/latency-summary.jsonl) || exit 1
cd "$LOCAL_REPO_DIR/.." || exit 1
mv "$LOCAL_REPO_DIR/logs/a-latency.jsonl" "$OUTPUT_DIR/a-latency.jsonl" || exit 1
mv "$LOCAL_REPO_DIR/logs/b-latency.jsonl" "$OUTPUT_DIR/b-latency.jsonl" || exit 1
mv "$LOCAL_REPO_DIR/logs/latency-summary.jsonl" "$OUTPUT_DIR/latency-summary.jsonl" || exit 1
if [ -f "$LOCAL_REPO_DIR/logs/latency-summary.html" ]; then
mv "$LOCAL_REPO_DIR/logs/latency-summary.html" "$OUTPUT_DIR/latency-summary.html" || exit 1
fi
echo "=== 测试完成!==="