diff --git a/scripts/BACDauto_test.sh b/scripts/BACDauto_test.sh index 0a5fee1..0853324 100755 --- a/scripts/BACDauto_test.sh +++ b/scripts/BACDauto_test.sh @@ -1,31 +1,78 @@ #!/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 /home/limingjie/LMJ_Work/OmniSocketGo +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' -export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin" pkill -f kcpserver 2>/dev/null || true -pkill -f 'cmd/kcpserver' 2>/dev/null || true +pkill -f 'bin/kcpserver' 2>/dev/null || true sleep 1 cd /home/ubuntu/OmniSocketGo -setsid go run ./cmd/kcpserver/ -listen 0.0.0.0:10909 > server_console.log 2>&1 server_console.log 2>&1 /dev/null || true -pkill -f 'cmd/kcpserver' 2>/dev/null || true +pkill -f 'bin/kcpserver' 2>/dev/null || true sleep 1 cd /home/ubuntu/OmniSocketGo -setsid go run ./cmd/kcpserver/ -mode=relay -listen 0.0.0.0:10909 -relay-remote 172.21.32.15:10909 > relay_console.log 2>&1 relay_console.log 2>&1 >> 2. 启动本地 Peer-A..." -nohup go run ./cmd/kcppeer/ \ +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 \ @@ -67,13 +117,14 @@ nohup go run ./cmd/kcppeer/ \ -latency-log logs/a-latency.jsonl \ -kcp-ts-debug-log logs/a-kcp-ts.jsonl \ -kcp-session-stats-log logs/a-kcp-stats.jsonl \ - -interactive=false > logs/peera_console.log 2>&1 & + < "$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 -q "opened KCP session as peer-a" logs/peera_console.log 2>/dev/null; then + 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 @@ -85,31 +136,42 @@ done # 3. 在远端后台启动 peer-b 整个发送流程,不依赖长 SSH 连接 echo ">>> 3. 启动远端 Peer-B 并执行 50 轮打流测试..." -ssh omni-peer "cd /home/boll/LMJWork/OmniSocketGo && rm -rf logs && mkdir -p logs inbox/b" +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' -export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin" - DONE_FLAG="/tmp/peerb_batch_done" BATCH_SCRIPT="/tmp/peerb_batch.sh" rm -f "$DONE_FLAG" cat > "$BATCH_SCRIPT" <<'INNER_EOF' #!/bin/bash -export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin" 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 -go run ./cmd/kcppeer/ \ +./bin/kcppeer \ -id peer-b \ -server 81.70.156.140:10909 \ -inbox-dir inbox/b \ @@ -123,7 +185,7 @@ exec 3>"$CMD_FIFO" # 等 peer-b 就绪 for i in $(seq 1 60); do - if grep -q "opened KCP session as peer-b" logs/peerb_console.log 2>/dev/null; then + 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 @@ -138,13 +200,31 @@ for i in $(seq 1 50); do done sleep 5 -echo "quit" >&3 +echo "quit" >&3 || true exec 3>&- -rm -f "$CMD_FIFO" + +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 # 写完成标记 -echo "done" > "$DONE_FLAG" +STATUS="done" INNER_EOF chmod +x "$BATCH_SCRIPT" @@ -154,37 +234,62 @@ DEPLOY_SCRIPT # 本地轮询等待远端完成(短 SSH 连接,不怕断开) echo " 等待 peer-b 发送完成(预计 ~110 秒)..." -for i in $(seq 1 180); do - if ssh omni-peer "test -f /tmp/peerb_batch_done" 2>/dev/null; then - echo " peer-b 发送完成 (${i}s)" +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 [ "$i" -eq 180 ]; then - echo " ERROR: peer-b 180s 内未完成" + 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 5 + sleep "$PEERB_POLL_INTERVAL_SEC" done # 4. 清理 echo ">>> 4. 清理所有进程..." -kill $PEER_A_PID 2>/dev/null || true -ssh bj-txy "pkill -f kcpserver || true; pkill -f 'cmd/kcpserver' || true" -ssh sz-txy "pkill -f kcpserver || true; pkill -f 'cmd/kcpserver' || true" +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 ./BDAClogs/$TIMESTAMP -scp -o ServerAliveInterval=15 -P 10022 boll@175.178.116.187:/home/boll/LMJWork/OmniSocketGo/logs/b-latency.jsonl ./logs/b-latency.jsonl +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 -mv ./logs/a-latency.jsonl ./BDAClogs/$TIMESTAMP/a-latency.jsonl -mv ./logs/b-latency.jsonl ./BDAClogs/$TIMESTAMP/b-latency.jsonl - -go run ./cmd/latencysummary \ - -input ./BDAClogs/$TIMESTAMP/a-latency.jsonl \ - -input ./BDAClogs/$TIMESTAMP/b-latency.jsonl \ - -output ./BDAClogs/$TIMESTAMP/latency-summary.jsonl +(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 "=== 测试完成!===" diff --git a/scripts/BDAanto_test.sh b/scripts/BDAanto_test.sh index 7d7c43d..c1d9db1 100755 --- a/scripts/BDAanto_test.sh +++ b/scripts/BDAanto_test.sh @@ -1,21 +1,63 @@ #!/bin/bash +LOCAL_REPO_DIR="/home/limingjie/LMJ_Work/RobotCompetition/OmniSocketGo" +KCP_PEER_BIN="./bin/kcppeer" +OUTPUT_ROOT="/home/limingjie/LMJ_Work/RobotCompetition/KCPData/BCAlogs/" +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 /home/limingjie/LMJ_Work/OmniSocketGo +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 -echo ">>> 1. 启动 Server D " +echo ">>> 1. 启动 Server D..." ssh bj-txy bash -s <<'EOF' -export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin" pkill -f kcpserver 2>/dev/null || true -pkill -f 'cmd/kcpserver' 2>/dev/null || true +pkill -f 'bin/kcpserver' 2>/dev/null || true sleep 1 cd /home/ubuntu/OmniSocketGo -setsid go run ./cmd/kcpserver/ -listen 0.0.0.0:10909 > server_console.log 2>&1 server_console.log 2>&1 >> 2. 启动本地 Peer-A..." -nohup go run ./cmd/kcppeer/ \ +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 81.70.156.140:10909 \ -inbox-dir inbox/a \ -latency-log logs/a-latency.jsonl \ - -interactive=false > logs/peera_console.log 2>&1 & + -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 -q "opened KCP session as peer-a" logs/peera_console.log 2>/dev/null; then + 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 @@ -58,22 +106,19 @@ done # 3. 在远端后台启动 peer-b 整个发送流程,不依赖长 SSH 连接 echo ">>> 3. 启动远端 Peer-B 并执行 50 轮打流测试..." -ssh omni-peer "cd /home/boll/LMJWork/OmniSocketGo && rm -rf logs && mkdir -p logs inbox/b" +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' -export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin" - DONE_FLAG="/tmp/peerb_batch_done" BATCH_SCRIPT="/tmp/peerb_batch.sh" rm -f "$DONE_FLAG" cat > "$BATCH_SCRIPT" <<'INNER_EOF' #!/bin/bash -export PATH="$PATH:/usr/local/go/bin:$HOME/go/bin" cd /home/boll/LMJWork/OmniSocketGo CMD_FIFO=/tmp/peerb_commands @@ -81,12 +126,20 @@ DONE_FLAG="/tmp/peerb_batch_done" rm -f "$CMD_FIFO" "$DONE_FLAG" mkfifo "$CMD_FIFO" +if [ ! -x ./bin/kcppeer ]; then + echo "ERROR: 缺少 ./bin/kcppeer" > logs/peerb_console.log + echo "error" > "$DONE_FLAG" + exit 1 +fi + # 启动 peer-b -go run ./cmd/kcppeer/ \ +./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=$! @@ -94,7 +147,7 @@ exec 3>"$CMD_FIFO" # 等 peer-b 就绪 for i in $(seq 1 60); do - if grep -q "opened KCP session as peer-b" logs/peerb_console.log 2>/dev/null; then + 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 @@ -112,6 +165,25 @@ sleep 5 echo "quit" >&3 exec 3>&- rm -f "$CMD_FIFO" + +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 # 写完成标记 @@ -125,37 +197,62 @@ DEPLOY_SCRIPT # 本地轮询等待远端完成(短 SSH 连接,不怕断开) echo " 等待 peer-b 发送完成(预计 ~110 秒)..." -for i in $(seq 1 180); do - if ssh omni-peer "test -f /tmp/peerb_batch_done" 2>/dev/null; then - echo " peer-b 发送完成 (${i}s)" +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 [ "$i" -eq 180 ]; then - echo " ERROR: peer-b 180s 内未完成" + if [ "$PEERB_STATUS" = "error" ]; then + echo " ERROR: peer-b 后台任务启动失败,请检查远端 logs/peerb_console.log" + exit 1 fi - # 每 5 秒查一次,减少 SSH 连接频率 - sleep 5 + if [ "$i" -eq "$PEERB_MAX_POLLS" ]; then + echo " ERROR: peer-b $((PEERB_MAX_POLLS * PEERB_POLL_INTERVAL_SEC))s 内未完成" + exit 1 + fi + sleep "$PEERB_POLL_INTERVAL_SEC" done # 4. 清理 echo ">>> 4. 清理所有进程..." -kill $PEER_A_PID 2>/dev/null || true -ssh bj-txy "pkill -f kcpserver || true; pkill -f 'cmd/kcpserver' || true" -ssh sz-txy "pkill -f kcpserver || true; pkill -f 'cmd/kcpserver' || true" +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" # 获取当前时间戳,格式为 YYYYMMDD_HHMMSS TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +OUTPUT_DIR="$OUTPUT_ROOT/$TIMESTAMP" + # 5. 拉取数据 & 生成报告 echo ">>> 5. 拉取数据并生成汇总报告..." -mkdir -p ./BCAlogs/$TIMESTAMP -scp -o ServerAliveInterval=15 -P 10022 boll@175.178.116.187:/home/boll/LMJWork/OmniSocketGo/logs/b-latency.jsonl ./logs/b-latency.jsonl +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 -mv ./logs/a-latency.jsonl ./BCAlogs/$TIMESTAMP/a-latency.jsonl -mv ./logs/b-latency.jsonl ./BCAlogs/$TIMESTAMP/b-latency.jsonl +(cd "$LOCAL_REPO_DIR/go" && go run ./cmd/latencysummary \ + -input "$LOCAL_REPO_DIR/logs/a-latency.jsonl" \ + -input "$LOCAL_REPO_DIR/logs/b-latency.jsonl" \ + -output "$LOCAL_REPO_DIR/logs/latency-summary.jsonl") || exit 1 -go run ./cmd/latencysummary \ - -input ./BCAlogs/$TIMESTAMP/a-latency.jsonl \ - -input ./BCAlogs/$TIMESTAMP/b-latency.jsonl \ - -output ./BCAlogs/$TIMESTAMP/latency-summary.jsonl +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 "=== 测试完成!==="