使用pm2执行yarn start会出错,而npm start工作正常

问题描述 投票:0回答:2

我有一个 NodeJs 微服务。纱线启动通常工作得很好。当我尝试使用 pm2 将其作为后台服务启动时,面临以下问题:

/Users/sairamk/.pm2/logs/api-error-21.log last 15 lines:
21|api     | /usr/local/Cellar/yarn/0.27.5_1/bin/yarn:2
21|api     | PREFIX="/usr/local" exec "/usr/local/Cellar/yarn/0.27.5_1/libexec/bin/yarn.js" "$@"
21|api     |                     ^^^^
21|api     |
21|api     | SyntaxError: Unexpected identifier
21|api     |     at createScript (vm.js:74:10)
21|api     |     at Object.runInThisContext (vm.js:116:10)
21|api     |     at Module._compile (module.js:533:28)
21|api     |     at Object.Module._extensions..js (module.js:580:10)
21|api     |     at Module.load (module.js:503:32)
21|api     |     at tryModuleLoad (module.js:466:12)
21|api     |     at Function.Module._load (module.js:458:3)
21|api     |     at Object.<anonymous> (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:70:21)
21|api     |     at Module._compile (module.js:569:30)
21|api     |     at Object.Module._extensions..js (module.js:580:10)

我使用的PM2命令:

pm2 start yarn --name api -- start

虽然 npm start 相同,但使用以下命令可以正常工作:

pm2 start npm --name api -- start

尝试探索多种可能性。我做错了什么?

node.js npm pm2 yarnpkg
2个回答
45
投票

您收到的错误是因为 bash 脚本(纱线)正在使用 node...

执行

pm2 的默认解释器设置为

node


要正确运行yarn(bash脚本),您必须将pm2的解释器设置为

bash

shell

pm2 start yarn --interpreter bash --name api -- start

或者当您使用

ecosystem.config.js
时:

module.exports = {
  apps : [{
    name      : 'yarn',
    script    : 'yarn',
    args      : 'start',
    interpreter: '/bin/bash',
    env: {
      NODE_ENV: 'development'
    }
  }]
};

2
投票

您的纱线命令指向 bash 脚本

/usr/local/Cellar/yarn/0.27.5_1/bin/yarn
而不是同一文件夹中的
yarn.js
。通过手动运行类似的东西

pm2 start /usr/local/Cellar/yarn/0.27.5_1/bin/yarn.js --name api -- start

它应该按预期工作。只需将路径调整为当前位置即可。就我而言,它是

/usr/share/yarn/bin/yarn.js


作为旁注:像这样执行yarn 占用的内存几乎是npm 的两倍。我不知道确切的原因,但我会坚持使用 npm for pm2,因为理论上它应该没有任何区别......

© www.soinside.com 2019 - 2024. All rights reserved.