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

使用pm2 start启动应用时遇`../lib/cli.js`语法错误

问题描述

执行pm2 start ecosystem.config.js时触发报错:

/root/.nvm/versions/node/v18.16.0/bin/npm: line 2: require('../lib/cli.js')(process)'
/root/.nvm/versions/node/v18.16.0/bin/npm: line 2: syntax error near unexpected token '../lib/cli.js''

已完整重装Node,但问题未解决。当前环境版本:

  • nvm -v 0.39.3
  • node -v 18.16.0
  • npm -v 9.5.1
  • pm2 -v 5.3.0

配置文件内容

ecosystem.config.js:

module.exports = {
  apps: [
    {
      name: "strapi_portfolio",
      cwd: "./server",
      script: "npm",
      args: "run start-prod",
      autorestart: true,
    },
    {
      name: "nextjs_portfolio",
      cwd: "./client",
      script: "npm",
      args: "run start-prod",
      autorestart: true,
      wait_ready: true,
      listen_timeout: 60000,
    },
  ],
};

启动脚本定义

package.json中的start-prod脚本:

"start-prod" : "npm install && npm run build && npm run start"

异常现象

手动单独执行npm run start-prod可正常运行,但PM2启动后进程状态显示errored,PM2完整报告如下:

--- PM2 report ----------------------------------------------------------------
Date                 : Wed Jun 14 2023 00:52:29 GMT+0200 (Central European Summer Time)
===============================================================================
--- Daemon -------------------------------------------------
pm2d version         : 5.3.0
node version         : 18.16.0
node path            : /root/.local/share/pnpm/pm2
argv                 : /root/.nvm/versions/node/v18.16.0/bin/node,/root/.local/share/pnpm/global/5/.pnpm/pm2@5.3.0/node_modules/pm2/lib/Daemon.js
argv0                : node
user                 : root
uid                  : 0
gid                  : 0
uptime               : 14min
===============================================================================
--- CLI ----------------------------------------------------
local pm2            : 5.3.0
node version         : 18.16.0
node path            : /root/.local/share/pnpm/pm2
argv                 : /root/.nvm/versions/node/v18.16.0/bin/node,/root/.local/share/pnpm/global/5/node_modules/pm2/bin/pm2,report
argv0                : node
user                 : root
uid                  : 0
gid                  : 0
===============================================================================
--- System info --------------------------------------------
arch                 : x64
platform             : linux
type                 : Linux
cpus                 : AMD EPYC 7282 16-Core Processor
cpus nb              : 4
freemem              : 7807197184
totalmem             : 8346025984
home                 : /root
===============================================================================
--- PM2 list -----------------------------------------------
┌────┬─────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name                │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├────┼─────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 1  │ nextjs_portfolio    │ default     │ 0.39.3  │ fork    │ 0        │ 0      │ 30   │ errored   │ 0%       │ 0b       │ root     │ disabled │
│ 0  │ strapi_portfolio    │ default     │ 0.39.3  │ fork    │ 0        │ 0      │ 30   │ errored   │ 0%       │ 0b       │ root     │ disabled │
└────┴─────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
===============================================================================
--- Daemon logs --------------------------------------------
/root/.pm2/pm2.log last 20 lines:
PM2        | 2023-06-14T00:42:03: PM2 log: Script /root/.nvm/versions/node/v18.16.0/bin/npm had too many unstable restarts (16). Stopped. "errored"
PM2        | 2023-06-14T00:42:03: PM2 log: App [nextjs_portfolio:1] starting in -fork mode-
PM2        | 2023-06-14T00:42:03: PM2 log: App [nextjs_portfolio:1] exited with code [2] via signal [SIGINT]
PM2        | 2023-06-14T00:42:03: PM2 log: Script /root/.nvm/versions/node/v18.16.0/bin/npm had too many unstable restarts (16). Stopped. "errored"
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
PM2        | 2023-06-14T00:43:03: PM2 log: App [nextjs_portfolio:1] online
解决方案

报错根源是PM2默认将script参数当作系统可执行文件直接运行,但/root/.nvm/versions/node/v18.16.0/bin/npm本质是Node.js脚本,不是shell可执行文件,因此触发语法错误。以下两种方法可解决:

方法一:指定Node执行npm脚本

修改ecosystem.config.js,明确用Node二进制文件来执行npm:

module.exports = {
  apps: [
    {
      name: "strapi_portfolio",
      cwd: "./server",
      script: "/root/.nvm/versions/node/v18.16.0/bin/node",
      args: "/root/.nvm/versions/node/v18.16.0/bin/npm run start-prod",
      autorestart: true,
    },
    {
      name: "nextjs_portfolio",
      cwd: "./client",
      script: "/root/.nvm/versions/node/v18.16.0/bin/node",
      args: "/root/.nvm/versions/node/v18.16.0/bin/npm run start-prod",
      autorestart: true,
      wait_ready: true,
      listen_timeout: 60000,
    },
  ],
};

方法二:通过Shell执行命令

用sh -c包裹npm命令,让PM2调用shell执行:

module.exports = {
  apps: [
    {
      name: "strapi_portfolio",
      cwd: "./server",
      script: "sh",
      args: "-c 'npm run start-prod'",
      autorestart: true,
    },
    {
      name: "nextjs_portfolio",
      cwd: "./client",
      script: "sh",
      args: "-c 'npm run start-prod'",
      autorestart: true,
      wait_ready: true,
      listen_timeout: 60000,
    },
  ],
};

额外优化建议

  1. start-prod脚本包含npm install,每次PM2重启都会重新安装依赖,建议将依赖安装、项目构建步骤放到部署流程中,避免重复消耗资源;
  2. 直接指定项目的Node启动入口文件(如Strapi的server.js、Next.js的.next/standalone/server.js),让PM2直接管理Node进程,更高效稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:47:49