node --trace-exit app.js # 打印仍活跃的句柄 process._getActiveHandles().map(h => h.constructor.name); npm i -D why-is-node-running
数据同步脚本跑完最后一行日志就不动了,进程挂在终端里迟迟不返回,任务本身其实早就结束,按组合键才能把终端收回来。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:事件循环里还有活跃的句柄,常见的是没关闭的数据库连接、没清理的定时器,还有没解除引用的套接字或者文件监听,只要有一个在,进程就不会退。
「Node 进程不退出」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
处理上按这个顺序:用现成的排查工具打印出当前仍然活跃的句柄栈;逐个关掉连接池以及没有清理干净的那些定时器;长连接在收尾的时候解除掉对事件循环的引用。
确认没问题再收工,脚本执行完自动退出,终端直接回到提示符,再跑一次结果一样。
