Ubuntu下使用Supervisor启动PM2进程出现重复启动问题排查
问题根因
异常的核心原因是Supervisor进程监控逻辑和PM2命令的运行模式不匹配:
pm2 start /home/deploy/nodeJS/app.js属于一次性触发命令,并非常驻前台的守护进程:执行时会先检查PM2 Daemon是否运行,未运行则拉起Daemon,随后向Daemon发送启动Node应用的指令,指令发送完成后该pm2 start进程就会直接退出,不会持续驻留。- Supervisor的默认判定逻辑是:只要配置中
command对应的进程退出,无论业务逻辑是否执行完成,都会判定服务异常,结合配置的autorestart=true规则,会反复重新执行启动命令。你看到的额外node /usr/bin/pm2 start /home/deploy/nodeJS/app.js进程,就是Supervisor检测到上一次pm2 start进程退出后,重复拉起的启动进程。
解决方案
二选一即可,优先推荐方案1。
方案1:使用pm2-runtime适配进程托管场景(推荐)
PM2官方专门为容器、外部进程管理器托管场景提供了前台常驻运行的pm2-runtime命令,替换原有配置中的启动命令即可,修改后配置如下:
[program:node-service] process_name=%(program_name)s command=pm2-runtime /home/deploy/nodeJS/app.js autostart=true autorestart=true redirect_stderr=true stdout_logfile=/home/deploy/logs/appjs.log
修改后依次执行supervisorctl reread、supervisorctl update加载新配置即可。pm2-runtime会以前台模式常驻运行,Supervisor可以直接监控进程状态,仅在进程真正异常退出时才触发重启,不会出现重复拉起的问题。
方案2:保留PM2 Daemon独立运行模式
如果需要保留PM2 Daemon的后台管理能力,可以调整配置让Supervisor直接监控前台运行的PM2 Daemon,步骤如下:
- 手动执行
pm2 start /home/deploy/nodeJS/app.js启动Node应用,确认运行正常后执行pm2 save保存PM2的应用列表快照。 - 修改Supervisor配置为:
[program:node-service] process_name=%(program_name)s command=pm2 --no-daemon resurrect autostart=true autorestart=true redirect_stderr=true stdout_logfile=/home/deploy/logs/appjs.log
配置中--no-daemon参数会让PM2 Daemon以前台模式运行,不会执行完指令就退出,resurrect会恢复之前pm2 save存储的应用列表,符合Supervisor的进程监控要求。
注意事项
所有被Supervisor这类进程托管系统管理的服务,必须以前台模式运行,不能自行fork切换到后台,否则必然会出现托管系统反复拉起进程的异常。
内容的提问来源于stack exchange,提问作者Krishna Chaitanya
相关产品推荐
相关产品推荐

