套件有 8 处 spawn,各自 finally 只发 kill()(SIGTERM)就 process.exit(), 被控端可能来不及退出 → 下一轮固定端口仍被占用,表现为「连跑第二次偶发失败、 重跑又绿」这种最难查的形态。 做法:把 spawn 包一层统一登记(同名函数遮蔽,调用点零改动),进程退出时对 仍存活的子进程 SIGKILL。单点收口,将来新增 spawn 也不会漏。 实测:连跑两次 34/34,退出后 pgrep 无残留 agent 进程。
套件有 8 处 spawn,各自 finally 只发 kill()(SIGTERM)就 process.exit(), 被控端可能来不及退出 → 下一轮固定端口仍被占用,表现为「连跑第二次偶发失败、 重跑又绿」这种最难查的形态。 做法:把 spawn 包一层统一登记(同名函数遮蔽,调用点零改动),进程退出时对 仍存活的子进程 SIGKILL。单点收口,将来新增 spawn 也不会漏。 实测:连跑两次 34/34,退出后 pgrep 无残留 agent 进程。