使用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, }, ], };
额外优化建议
start-prod脚本包含npm install,每次PM2重启都会重新安装依赖,建议将依赖安装、项目构建步骤放到部署流程中,避免重复消耗资源;- 直接指定项目的Node启动入口文件(如Strapi的
server.js、Next.js的.next/standalone/server.js),让PM2直接管理Node进程,更高效稳定。
内容的提问来源于stack exchange,提问作者Louis Lecouturier
相关产品推荐
相关产品推荐

