#!/usr/bin/env bash # scripts/e2e_check.sh —— 端到端冒烟测试 # 启动 bringup/pubsub_launch 8 秒,期间持续验证 chatter 真的有消息 set -eo pipefail WORKSPACE="${WORKSPACE:-/root/ros2_ws}" source /opt/ros/humble/setup.bash source "${WORKSPACE}/install/setup.bash" cd "${WORKSPACE}" echo "[e2e] 启动 bringup/pubsub_launch.py (≈6s 冒烟)..." ros2 launch bringup pubsub_launch.py > /tmp/e2e_launch.log 2>&1 & LAUNCH_PID=$! sleep 3 echo echo "[e2e] === 验证 topic ===" echo "[e2e] --- topic list ---" ros2 topic list 2>/dev/null echo echo "[e2e] --- topic hz /chatter (3s) ---" # 用 stdbuf 强制行缓冲,避免 docker exec 捕获不到输出 stdbuf -oL -eL timeout 3 ros2 topic hz /chatter 2>&1 | tail -5 || true echo echo "[e2e] --- topic info /chatter -v ---" # 关键:不要 | head -N,会触发 BrokenPipe 让 ros2 崩 # 用 ros2 自带 --no-arr 之外的参数,或者重定向后再过滤 ros2 topic info /chatter -v 2>/dev/null | awk 'NR<=20' || true echo echo "[e2e] --- node list ---" ros2 node list 2>/dev/null echo echo "[e2e] 关停 launch..." kill -INT "${LAUNCH_PID}" 2>/dev/null || true pkill -f "ros2 launch bringup" 2>/dev/null || true # ❗ ros2 launch fork 出的 chatter_* 子进程会 reparent 到 PID 1(孤儿), # SIGINT 给 launch 不会传递给它们,必须显式 pkill pkill -INT -f chatter_publisher 2>/dev/null || true pkill -INT -f chatter_subscriber 2>/dev/null || true pkill -INT -f chatter_publisher_cpp 2>/dev/null || true pkill -INT -f chatter_subscriber_cpp 2>/dev/null || true sleep 1 pkill -9 -f chatter 2>/dev/null || true wait "${LAUNCH_PID}" 2>/dev/null || true echo echo "[e2e] ✅ DONE. 详细日志: cat /tmp/e2e_launch.log"