症状
程序完成了工作但进程始终不退出:shell 提示符不返回,CI 任务超时。列出活动句柄会看到仍打开的定时器、套接字或消息端口,它们让事件循环保持存活。终止 worker 也许能让其 Promise 落定,但父进程仍会因自身句柄挂起,因此两侧都要考虑。
诊断
用 _getActiveHandles 列出活动句柄;用 –trace-exit 观察为何进程不退出;必要时调用 worker.terminate 作为兜底。
node -e "process._getActiveHandles().forEach(h=>console.log(h.constructor.name))"
根因
worker 或父进程仍持有活动句柄或未落定的 Promise,事件循环永不空闲,进程无法自然退出。
修复
工作完成时关闭定时器、套接字与消息端口,确保 worker 落定其 Promise 或被终止;在关闭路径中以 worker.terminate 作为有界的兜底。
验证
重跑负载确认进程在数秒内退出,并确认完成后没有残留活动句柄。干净退出且无残留句柄即证明关闭路径正确。
常见陷阱
依赖 process.exit 强退会截断未写完的输出与未刷新的数据;应优先优雅关闭再兜底终止。