296 lines
8.1 KiB
Bash
Executable File
296 lines
8.1 KiB
Bash
Executable File
#!/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 "=== 测试完成!==="
|