Node.js pm2几乎每秒都在重启
Node.js pm2 keeps restarting almost every second
我已经在 Azure 服务器上部署了一个 express.js 应用程序。我用pm2做进程管理。
问题是 pm2 几乎每秒钟都会重启。
staging@Server:/srv/apps/myapp/current$ pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app │ 0 │ fork │ 35428 │ online │ 0 │ 0s │ 20.465 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
staging@Server:/srv/apps/myapp/current$ pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app │ 0 │ fork │ 35492 │ online │ 7 │ 0s │ 59.832 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
staging@Server:/srv/apps/myapp/current$ pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app │ 0 │ fork │ 35557 │ online │ 13 │ 0s │ 21.816 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
~/.pm2/pm2.log
2016-05-10 17:39:34: Starting execution sequence in -fork mode- for app name:start id:0
2016-05-10 17:39:34: App name:start id:0 online
2016-05-10 17:39:35: App [start] with id [0] and pid [3149], exited with code [255] via signal [SIGINT]
2016-05-10 17:39:35: Starting execution sequence in -fork mode- for app name:start id:0
2016-05-10 17:39:35: App name:start id:0 online
2016-05-10 17:39:35: App [start] with id [0] and pid [3158], exited with code [255] via signal [SIGINT]
2016-05-10 17:39:35: Starting execution sequence in -fork mode- for app name:start id:0
2016-05-10 17:39:35: App name:start id:0 online
2016-05-10 17:39:36: App [start] with id [0] and pid [3175], exited with code [255] via signal [SIGINT]
2016-05-10 17:39:36: Starting execution sequence in -fork mode- for app name:start id:0
我在我的应用程序中使用咖啡脚本。并使用 pm2 start app.coffee
启动应用程序
package.json
{
"name": "myapp",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "gulp start-server"
},
"dependencies": {
"bcrypt-nodejs": "0.0.3",
"body-parser": "~1.13.2",
"co": "^4.6.0",
"coffee-script": "^1.10.0",
"connect-mongo": "^1.1.0",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"express-session": "^1.13.0",
"gulp": "^3.9.1",
"mongoose": "^4.4.14",
"morgan": "~1.6.1",
"newrelic": "^1.26.2",
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"pm2": "^1.1.3",
"pug": "^2.0.0-alpha6",
"request": "^2.72.0",
"serve-favicon": "~2.3.0"
},
"devDependencies": {
"shipit-cli": "^1.4.1",
"shipit-deploy": "^2.1.3",
"shipit-npm": "^0.2.0",
"shipit-pm2-nginx": "^0.1.8"
}
}
我是 node.js 的新手。可能是我没有看到明显的。请帮帮我。
默认情况下,pm2 将应用程序日志写入 ~/.pm2/logs
并将 pm2 特定日志写入 pm2.log
。我们需要检查这两个位置以调试问题。
另一种调试应用程序的方法是手动启动应用程序,即类似于 npm run start
或 node path/yo/your/bin.js
它应该会为您提供解决问题并继续前进的缺失信息。
我们也遇到了类似的问题,pm2 几乎每秒都会重新启动一个进程以启动 node.js 网络应用程序。
我们发现 MongoDB 不是 运行,然后 Web 应用程序会在启动时尝试连接到数据库,但会失败。这将提示 pm2 一遍又一遍地重新启动进程,导致每秒重新启动。
如果这是您的问题,请尝试从 MongoDB 开始 mongod
或 mongod --dbpath [your db path]
?
检查您的应用是否修改了项目文件夹中的文件(例如日志文件)。如果启用 watch
标志,则对任何文件的更改都会触发重新启动。
为防止这种情况,请使用 process
文件并在其中添加 watch_ignore
标志。
这里有一个关于如何使用进程文件的文档:
PM2 - Process File
如果您已使用 NPM 打包并启动您的应用程序,则适用。
我只需更改 ecosystem.configure.js 中的 "script" 文件(如果您正在使用,则更改 json 文件)。
app.js 不起作用,我不得不将其替换为 ./bin/www 然后它起作用了。
一定要查看日志,看看哪里出了问题(pm2 describe {process}
会告诉你日志的保存位置)。此外,通过停止 pm2 进程并手动 运行 启动您的应用程序(即 npm run start
),看看您是否可以 运行 没有 pm2 的 express 应用程序。
如果您可以手动 运行 该应用程序但它不能与 pm2 一起使用,则可能是该应用程序未 运行 来自正确的目录(您可以使用pm2 cwd 参数)。
另一个常见问题是没有设置正确的环境变量,因此请检查您的 json 或 ecosystem file。也可以看看pm2的环境是运行 pm2 prettylist
.
我知道这有点晚了,除了滚动浏览此内容的任何人之外,经过数小时的研究,我找到了 n 个实际解决方案。
所以我想分享这个备忘单:https://devhints.io/pm2
pm2 start app.js --no-autorestart
刚刚运行也进入这个错误。我 运行 dmesg
这告诉我我的进程被 Linux 内核杀死,因为它使用的内存比我给 Docker 容器的内存多 运行里面。
为容器分配更多内存解决了这种情况下的问题。
我已经在 Azure 服务器上部署了一个 express.js 应用程序。我用pm2做进程管理。
问题是 pm2 几乎每秒钟都会重启。
staging@Server:/srv/apps/myapp/current$ pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app │ 0 │ fork │ 35428 │ online │ 0 │ 0s │ 20.465 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
staging@Server:/srv/apps/myapp/current$ pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app │ 0 │ fork │ 35492 │ online │ 7 │ 0s │ 59.832 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
staging@Server:/srv/apps/myapp/current$ pm2 list
┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ app │ 0 │ fork │ 35557 │ online │ 13 │ 0s │ 21.816 MB │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────────────┴──────────┘
~/.pm2/pm2.log
2016-05-10 17:39:34: Starting execution sequence in -fork mode- for app name:start id:0
2016-05-10 17:39:34: App name:start id:0 online
2016-05-10 17:39:35: App [start] with id [0] and pid [3149], exited with code [255] via signal [SIGINT]
2016-05-10 17:39:35: Starting execution sequence in -fork mode- for app name:start id:0
2016-05-10 17:39:35: App name:start id:0 online
2016-05-10 17:39:35: App [start] with id [0] and pid [3158], exited with code [255] via signal [SIGINT]
2016-05-10 17:39:35: Starting execution sequence in -fork mode- for app name:start id:0
2016-05-10 17:39:35: App name:start id:0 online
2016-05-10 17:39:36: App [start] with id [0] and pid [3175], exited with code [255] via signal [SIGINT]
2016-05-10 17:39:36: Starting execution sequence in -fork mode- for app name:start id:0
我在我的应用程序中使用咖啡脚本。并使用 pm2 start app.coffee
package.json
{
"name": "myapp",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "gulp start-server"
},
"dependencies": {
"bcrypt-nodejs": "0.0.3",
"body-parser": "~1.13.2",
"co": "^4.6.0",
"coffee-script": "^1.10.0",
"connect-mongo": "^1.1.0",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"express-session": "^1.13.0",
"gulp": "^3.9.1",
"mongoose": "^4.4.14",
"morgan": "~1.6.1",
"newrelic": "^1.26.2",
"passport": "^0.3.2",
"passport-local": "^1.0.0",
"pm2": "^1.1.3",
"pug": "^2.0.0-alpha6",
"request": "^2.72.0",
"serve-favicon": "~2.3.0"
},
"devDependencies": {
"shipit-cli": "^1.4.1",
"shipit-deploy": "^2.1.3",
"shipit-npm": "^0.2.0",
"shipit-pm2-nginx": "^0.1.8"
}
}
我是 node.js 的新手。可能是我没有看到明显的。请帮帮我。
pm2 将应用程序日志写入 ~/.pm2/logs
并将 pm2 特定日志写入 pm2.log
。我们需要检查这两个位置以调试问题。
另一种调试应用程序的方法是手动启动应用程序,即类似于 npm run start
或 node path/yo/your/bin.js
它应该会为您提供解决问题并继续前进的缺失信息。
我们也遇到了类似的问题,pm2 几乎每秒都会重新启动一个进程以启动 node.js 网络应用程序。
我们发现 MongoDB 不是 运行,然后 Web 应用程序会在启动时尝试连接到数据库,但会失败。这将提示 pm2 一遍又一遍地重新启动进程,导致每秒重新启动。
如果这是您的问题,请尝试从 MongoDB 开始 mongod
或 mongod --dbpath [your db path]
?
检查您的应用是否修改了项目文件夹中的文件(例如日志文件)。如果启用 watch
标志,则对任何文件的更改都会触发重新启动。
为防止这种情况,请使用 process
文件并在其中添加 watch_ignore
标志。
这里有一个关于如何使用进程文件的文档: PM2 - Process File
如果您已使用 NPM 打包并启动您的应用程序,则适用。
我只需更改 ecosystem.configure.js 中的 "script" 文件(如果您正在使用,则更改 json 文件)。 app.js 不起作用,我不得不将其替换为 ./bin/www 然后它起作用了。
一定要查看日志,看看哪里出了问题(pm2 describe {process}
会告诉你日志的保存位置)。此外,通过停止 pm2 进程并手动 运行 启动您的应用程序(即 npm run start
),看看您是否可以 运行 没有 pm2 的 express 应用程序。
如果您可以手动 运行 该应用程序但它不能与 pm2 一起使用,则可能是该应用程序未 运行 来自正确的目录(您可以使用pm2 cwd 参数)。
另一个常见问题是没有设置正确的环境变量,因此请检查您的 json 或 ecosystem file。也可以看看pm2的环境是运行 pm2 prettylist
.
我知道这有点晚了,除了滚动浏览此内容的任何人之外,经过数小时的研究,我找到了 n 个实际解决方案。
所以我想分享这个备忘单:https://devhints.io/pm2
pm2 start app.js --no-autorestart
刚刚运行也进入这个错误。我 运行 dmesg
这告诉我我的进程被 Linux 内核杀死,因为它使用的内存比我给 Docker 容器的内存多 运行里面。
为容器分配更多内存解决了这种情况下的问题。