You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,步骤如下:

  1. 手动执行pm2 start /home/deploy/nodeJS/app.js启动Node应用,确认运行正常后执行pm2 save保存PM2的应用列表快照。
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:31:03