如何解决 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 start
来 usually 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
有没有人知道我如何让它工作或尝试过类似的事情?我会满足于以下答案:
- 在 Windows 服务器上 运行 Docusaurus 的替代方法。
- 使用 PM2 的替代方法。
- 任何其他想法。
如有冒犯,请见谅。
编辑:
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”
- 如果命令执行并且return提示。那么你不能 运行 以你的方式使用 pm2。你应该试试别的方法。
- 如果“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!伙计们
我正在尝试 运行 Docusaurus 在 Windows Server 2016 上使用 Node.js 版本 12.14.0 通过 IIS10 上的 PM2。我正在使用 PM2,因此我可以在服务器重启后重启应用程序。我现在必须承认,今天是我第一次尝试使用 Node.js,所以请耐心等待。
这是通过在 Docusaurus 目录中调用 npm run start
来 usually 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配置文件:
{
"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
有没有人知道我如何让它工作或尝试过类似的事情?我会满足于以下答案:
- 在 Windows 服务器上 运行 Docusaurus 的替代方法。
- 使用 PM2 的替代方法。
- 任何其他想法。
如有冒犯,请见谅。
编辑:
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”
- 如果命令执行并且return提示。那么你不能 运行 以你的方式使用 pm2。你应该试试别的方法。
- 如果“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!伙计们