Files
2026-08-05 18:17:25 +08:00

61 lines
2.0 KiB
Bash

#!/usr/bin/env bash
# scripts/launch.sh —— 跑 demo launch(可限时自动关停)
#
# 用法:
# # 一直跑(前台,Ctrl+C 停)
# docker exec -it ros2_dev bash /root/ros2_ws/scripts/launch.sh pubsub_launch
#
# # 跑 N 秒后自动停(脚本、CI、截图用)
# docker exec ros2_dev bash /root/ros2_ws/scripts/launch.sh pubsub_launch 10
#
# 第一个参数:launch 文件名(不带 .py),默认 pubsub_launch
# 第二个参数:运行时长(秒),默认 0 = 不限时
set -eo pipefail
WORKSPACE="${WORKSPACE:-/root/ros2_ws}"
NAME="${1:-pubsub_launch}"
RUNTIME="${2:-0}"
source /opt/ros/humble/setup.bash
source "${WORKSPACE}/install/setup.bash"
cd "${WORKSPACE}"
# RUNTIME 合法化:非整数 / 空 / "forever" → -1(一直跑)
if ! [[ "${RUNTIME}" =~ ^-?[0-9]+$ ]]; then
RUNTIME="-1"
fi
echo "[launch.sh] starting: ros2 launch bringup ${NAME}.py (runtime=${RUNTIME}s; -1 = forever)"
if [ "${RUNTIME}" -ge 0 ]; then
# 后台跑 + 给定时炸弹
ros2 launch bringup "${NAME}.py" &
LAUNCH_PID=$!
if [ "${RUNTIME}" -gt 0 ]; then
sleep "${RUNTIME}"
echo "[launch.sh] reaching runtime limit, killing..."
kill -INT "${LAUNCH_PID}" 2>/dev/null || true
pkill -f "ros2 launch bringup ${NAME}" 2>/dev/null || true
# ❗ launch fork 出的 chatter_* 子进程 reparent 到 PID 1,SIGINT 不会传递
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
else
# 0 = 等用户 Ctrl+C
wait "${LAUNCH_PID}" 2>/dev/null || true
fi
else
# -1 = forever(后台跑,主进程立刻返回)
nohup ros2 launch bringup "${NAME}.py" >/dev/null 2>&1 &
disown
echo "[launch.sh] ✅ launched in background (forever mode, pid=$!)"
echo "[launch.sh] (用 'pkill -f chatter' 或 'bash scripts/clean.sh' 清理)"
fi
echo "[launch.sh] ✅ exit"