图 17-1 · 解析 → Runner → 子进程 → SIGINT 级联
本图回答的问题:ros2 launch 读完 .launch.py 之后做了什么?一次 Ctrl+C 如何停干净全部节点?
剧本层
编排层
进程层
my.launch.py
Node(A) → Action1
Node(B) → Action2
If(mode) Node(C) → Action3
OnExit(A) → cleanup
入口:generate_launch_description()
解析
Launch Runner
① 按序执行 Action
② 评估 condition
③ 拉起子进程并监管
[talker-1] pid 4242
output='screen' 汇入同一终端
[listener-2] pid 4243
日志前缀 = 谁在说话
[debug-3] 条件节点
condition 成立才创建进程
评估通过才 spawn
Ctrl+C → Runner 向全部子进程广播 SIGINT
talker-1 finished cleanly · listener-2 finished cleanly · 无僵尸残留
不要直接 kill Launch 父进程——绕过级联会留下孤儿节点
退出信号由 Runner 统一下发
退出同一机制的另一面:事件编排
OnProcessExit(A) → 自动执行 on_exit 里的 Action(恢复/清理/接续)
监管日志是身份证明
process has died / finished cleanly
✅ 一次 Ctrl+C 全停 = Runner 广播 SIGINT 的级联清理
⚠️ 直接 kill 父进程 → 绕过级联留孤儿 · condition False 的 name 也占号
🔍 04 节第 1 步:两行 process has finished cleanly
EXP-17 · Launch 启动系统