使用ecosystem.config.js启动应用时pm2报错,请求排查原因
问题原因与解决方案
错误根源
你遇到的语法错误,是因为错误地让bash去执行npm二进制文件导致的:
npm本身是基于Node.js开发的CLI工具,它的启动脚本使用Node语法(比如require),而你在配置里指定了exec_interpreter: "bash",相当于强制让bash去解析npm的脚本——bash根本不认识Node的语法,自然会抛出syntax error。
另外你的配置存在冗余冲突:既指定了script: "npm"和args: "start",又用exec_args写了完整的构建启动命令,这会导致pm2执行逻辑混乱。
修正后的配置方案
直接去掉多余的exec_interpreter和exec_args,用command字段整合完整的构建+启动流程即可,同时确保pm2能正确识别nvm管理的Node版本:
方案1:简洁版配置
module.exports = { apps: [ { name: "strapi_portfolio", cwd: "./server", // 直接写完整命令,pm2会自动用shell执行 command: "npm run build && npm start", exec_mode: "fork", autorestart: true, }, { name: "nextjs_portfolio", cwd: "./client", command: "npm run build && npm start", exec_mode: "fork", autorestart: true, wait_ready: true, listen_timeout: 60000, }, ], };
方案2:适配nvm环境的配置(如果pm2找不到nvm管理的Node版本)
如果执行时出现npm: command not found,可以在命令前先加载nvm环境:
module.exports = { apps: [ { name: "strapi_portfolio", cwd: "./server", command: "source ~/.nvm/nvm.sh && nvm use 18.15.0 && npm run build && npm start", exec_mode: "fork", autorestart: true, }, { name: "nextjs_portfolio", cwd: "./client", command: "source ~/.nvm/nvm.sh && nvm use 18.15.0 && npm run build && npm start", exec_mode: "fork", autorestart: true, wait_ready: true, listen_timeout: 60000, }, ], };
额外说明
- 如果你想保留
script和args的写法,也可以删除exec_interpreter和exec_args,仅保留script: "npm"和args: "run build && npm start",效果和用command字段一致。 - 建议提前在服务器执行
nvm alias default 18.15.0,将该版本设为默认Node版本,这样pm2启动时无需手动指定版本。
内容的提问来源于stack exchange,提问作者Louis Lecouturier
相关产品推荐
相关产品推荐

