You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PM2中运行两个独立Node.js应用?启动异常求助

解决PM2启动npm start时进程混乱的问题

我之前也踩过这个坑!核心问题是:当你直接用pm2 start npm这类命令时,PM2默认不会自动切换到你当前的项目目录,而是会在它自身的工作目录(或者系统默认的/usr/bin相关路径)执行npm命令,这就导致不管你指定什么--name、在哪个目录下运行命令,最终都是在同一个目录执行npm start,自然会出现“名字不同但实为同一应用”,甚至随机启动不同项目的混乱情况。

下面是几个靠谱的解决办法:

1. 命令行指定工作目录(快速临时方案)

在启动命令里明确加上--cwd参数,告诉PM2要切换到哪个项目目录下执行npm start

# 启动项目A
pm2 start npm --name "app-A" --cwd /path/to/your/app-A -- start

# 启动项目B
pm2 start npm --name "app-B" --cwd /path/to/your/app-B -- start

这里的--是用来分隔PM2的参数和要传递给npm的参数(也就是start),--cwd则强制PM2先切换到指定的项目目录,再执行npm start,这样每个项目的启动环境就完全隔离了。

2. 使用PM2生态系统配置文件(推荐长期方案)

如果需要管理多个项目,写一个ecosystem.config.js配置文件会更清晰,也不容易出错。在任意目录创建这个文件,内容如下:

module.exports = {
  apps: [
    {
      name: "app-A",
      script: "npm",
      args: "start",
      cwd: "/path/to/your/app-A", // 项目A的目录
      watch: false, // 根据需要开启监听
      env: {
        NODE_ENV: "production"
      }
    },
    {
      name: "app-B",
      script: "npm",
      args: "start",
      cwd: "/path/to/your/app-B", // 项目B的目录
      watch: false,
      env: {
        NODE_ENV: "production"
      }
    }
  ]
}

然后用以下命令启动:

# 启动所有配置的应用
pm2 start ecosystem.config.js

# 只启动指定应用
pm2 start ecosystem.config.js --only app-A

这种方式的好处是所有配置都集中管理,后续修改、重启都很方便,也能避免命令行参数输入错误。

3. 清理残留的混乱进程

在重新启动正确的应用前,建议先清理掉之前PM2中残留的混乱进程,避免冲突:

# 删除所有PM2进程
pm2 delete all

# 保存当前PM2的进程列表(清理后可以先不做,等启动正确应用后再执行)
pm2 save

验证是否生效

启动完成后,用以下命令检查每个进程的配置:

# 查看所有进程列表,确认name和cwd对应正确
pm2 list

# 查看单个进程的详细信息,重点看cwd和command字段
pm2 describe app-A

如果看到cwd是你指定的项目目录,command/usr/bin/npm start且在正确的目录下执行,就说明配置生效了。

内容的提问来源于stack exchange,提问作者skypower

火山引擎 最新活动