PM2未将退出码为1的应用判定为错误且不自动重启如何解决?
PM2 异常退出不重启问题解决方法
核心根因
你遇到的状态误判问题本质是PM2的进程追踪错位:使用yarn作为启动入口时,PM2默认只监听yarn本身的父进程状态,不会自动追踪yarn派生出来的实际Node.js业务子进程。当业务子进程抛错以退出码1终止时,如果yarn父进程没有同步退出,PM2就会持续误判应用状态为online,自然不会触发自动重启逻辑。
你其中一个项目升级PM2 v5.2.0后恢复,只是刚好该项目的yarn版本和PM2 v5.2.0的子进程追踪逻辑兼容,不代表所有版本组合都能正常工作。
可落地解决步骤(按优先级排序)
- 优先替换启动方式,从根源规避进程追踪问题
生产环境不要用yarn/npm作为PM2的启动入口,直接指向编译后的业务入口文件,让PM2直接托管业务Node进程。比如你的start:prod脚本实际执行的是node dist/main.js,就把启动命令替换为:
这种方式下PM2可以100%捕获进程的所有退出信号、异常崩溃事件,不会出现状态误判,也是PM2推荐的生产启动方案。pm2 start dist/main.js --name project-name - 若必须保留yarn脚本启动方式,先做版本对齐
对比两个项目的yarn版本:如果出问题的项目用的是Yarn Berry(v2+),PM2 v5.2.0本身对该版本yarn的子进程追踪存在兼容bug,要么把yarn降级到1.22.x稳定版,要么把PM2升级到v5.3.0以上版本再测试。 - 排查旧配置干扰
先执行以下命令清理PM2里残留的旧进程配置和缓存:
同时检查出问题项目根目录下是否存在遗留的pm2 delete project-name pm2 cleardumpecosystem.config.js配置文件,如果配置里写了autorestart: false、max_restarts: 0这类规则,PM2会优先读取文件配置,哪怕命令行没传对应参数也会导致重启逻辑失效。 - 定位具体追踪异常
重新启动应用时加上--no-daemon参数让PM2前台运行,触发业务报错后直接看控制台输出,就能明确是yarn父进程未随子进程退出,还是PM2没有捕获到子进程的退出事件,针对性调整即可。
验证标准
调整完成后主动触发业务代码抛错,若PM2日志中打印出应用退出记录、状态从online切换为restarting,即代表修复生效。
内容的提问来源于stack exchange,提问作者JaffParker
相关产品推荐
相关产品推荐

