如何解决 Windows 上在 PM2 中启动应用程序的问题?

How can I fix issues launching an app in PM2 on Windows?

我正在尝试 运行 Docusaurus 在 Windows Server 2016 上使用 Node.js 版本 12.14.0 通过 IIS10 上的 PM2。我正在使用 PM2,因此我可以在服务器重启后重启应用程序。我现在必须承认,今天是我第一次尝试使用 Node.js,所以请耐心等待。

这是通过在 Docusaurus 目录中调用 npm run startusually run。在测试 Node.js 以及 'Hello World' 应用程序是否会在服务器重启时启动时,我按照 PM2 文档中的建议使用了 ecosystem.config.js。像这样调用了一个 javascript 文件。

module.exports = {
    apps: [
      {
        name: "HelloWorld",
        script: "apps\hello_world.js",
        instances: 1
      }
    ]
  }

这工作正常,但我找不到任何关于如何从这个文件 运行 npm start 的文档(虽然我确实尝试调用一个单独的批处理文件,但也没有用).然后我看到 我可以调用记录更多选项的 JSON 文件。

JSON配置文件:

{
    "apps": [
        {
            "name": "docs",
            "cwd": "apps\docs",
            "script": "npm",
            "args": "start"
        },
        {
            "name": "HelloWorld",
            "script": "apps\hello_world.js"
        }
    ]
}

'HelloWorld' 脚本启动,但文档应用程序未启动。

pm2 报告提供以下输出:

PM2        | 2020-01-07T17:54:20: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:20: PM2 log: App [docs:0] starting in -fork mode-
PM2        | 2020-01-07T17:54:20: PM2 log: App [docs:0] online
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] starting in -fork mode-
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] online
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] starting in -fork mode-
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] online
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] starting in -fork mode-
PM2        | 2020-01-07T17:54:21: PM2 log: App [docs:0] online
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] starting in -fork mode-
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] online
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] starting in -fork mode-
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] online
PM2        | 2020-01-07T17:54:22: PM2 log: App [docs:0] exited with code [1] via signal [SIGINT]
PM2        | 2020-01-07T17:54:22: PM2 log: Script C:\PROGRAM FILES\NODEJS\NPM.CMD had too many unstable restarts (16). Stopped. "errored"

这让我想到 GitHub 上的 this 问题。不过,关于这些问题的 activity 似乎并不多,而且历史上也有过此类事件。

我认为可能是我对 PM2 做错了什么或者它有问题,因为我也无法通过命令行使用 PM2 启动文档。

C:\Node JS\apps\docs>pm2 start npm --name "docs" -- start

有没有人知道我如何让它工作或尝试过类似的事情?我会满足于以下答案:

如有冒犯,请见谅。

编辑:

pm2 start ecosystem.json --only docs

的输出
C:\Node JS>pm2 start ecosystem.json --only docs
[PM2][WARN] Applications docs not running, starting...
[PM2][ERROR] Process failed to launch EPERM: operation not permitted, open 'C:\etc\.pm2\logs\docs-out.log'

它引用的日志是空的。 docs-error.log 重复同样的错误,但是从昨晚开始就没有更新了。它可能是我在 JSON 文件中尝试不同的语法创建的,但无论如何都会发布它。

SyntaxError: Unexpected token ':'
    at Module._compile (internal/modules/cjs/loader.js:895:18)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Object.<anonymous> (C:\Users\user\AppData\Roaming\npm\node_modules\pm2\lib\ProcessContainerFork.js:27:21)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
    at Module.load (internal/modules/cjs/loader.js:815:32)
    at Function.Module._load (internal/modules/cjs/loader.js:727:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
C:\PROGRAM FILES\NODEJS\NPM.CMD:1
:: Created by npm, please don't edit manually.

问题实际上是 pm2 如何通过 Windows 上的批处理文件调用节点。如果您直接使用完整路径调用 npm-cli.js,程序将 运行 没有问题。

{
    "apps": [
        {
            "name": "docs",
            "cwd": "some_path_to\apps\docs",
            "script": "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js",
            "args": "start",
            "exec_mode": "cluster",
            "instances": 1,
            "interpreter": "none"
        }
    ]
}

你的问题解决了吗?

我运行这个在macos下没问题,pm2版本是5.1.0

请尝试:运行 在您的终端上“npm start”

  1. 如果命令执行并且return提示。那么你不能 运行 以你的方式使用 pm2。你应该试试别的方法。
  2. 如果“npm start”没有return提示。那么你可以。

这是更简洁的最新答案:

package.json 文件(包含以下示例脚本)

"scripts": {
    "start": "concurrently npm:server npm:dev",
    "dev": "react-scripts start",
    "build": "node ./scripts/build.js",
    "eject": "react-scripts eject",
    "lint": "eslint src server",
    "shivkumarscript": "ts-node -T -P server/tsconfig.json server/index.ts"
  }

假设我们想要 运行 使用 pm2 实用程序命名为 'shivkumarscript' 的脚本。因此,我们的 pm2 配置文件应该如下所示,包含值为 'npm' 的 'script' 键和值为 'run ' 的 'args' 键。在我们的例子中,脚本名称是 'shivkumarscript'。

ecosystem.config.json 文件

module.exports = {
    apps: [
        {
            name: "NodeServer",
            script: "npm",
            automation: false,
            args: "run shivkumarscript",
            env: {
                NODE_ENV: "development"
            },
            env_production: {
                NODE_ENV: "production"
            }
        }
    ]
}

假设您已经在您的机器上安装了 Node.js、NPM 和 PM2。然后下面应该是通过 pm2 启动应用程序的命令,它将依次 运行 npm 脚本(应用程序的 package.json 文件中提到的命令行):

生产环境:

pm2 start ecosystem.config.js --env production --only NodeServer

开发环境:

pm2 start ecosystem.config.js --only NodeServer

...还有 Boooom!伙计们