Node.js pm2 几乎每秒都在重启

Posted

技术标签:

【中文标题】Node.js pm2 几乎每秒都在重启【英文标题】:Node.js pm2 keeps restarting almost every second 【发布时间】:2016-09-05 20:18:12 【问题描述】:

我在 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。 @XiaominWu 这里是-github.com/resaca/node_debug_app。我不确定您是否可以重现该问题。因为我在我的开发机器上使用了相同的命令并且没有问题。 @mh-cbon 是的,我尝试在没有shipit 的情况下从服务器运行pm2 start app.coffee。还是一样。 我的意思是node something.js。顺便说一句,您需要在执行之前将咖啡脚本构建为 JS。 【参考方案1】:

检查您的应用是否修改了项目文件夹中的文件(例如日志文件)。如果启用了watch 标志,则对任何文件的更改都会触发重新启动。

为防止这种情况,请使用process 文件并在其中添加watch_ignore 标志。

以下是有关如何使用流程文件的文档: PM2 - Process File

【讨论】:

谢谢你!这肯定会导致一些非常奇怪的行为。 这让我发疯了将近一个小时,谢谢 你是救生员。【参考方案2】:

默认情况下,pm2 将应用程序日志写入~/.pm2/logs,并将 pm2 特定日志写入pm2.log。我们需要检查这两个位置来调试问题。

调试应用程序的另一种方法是手动启动应用程序,例如npm run startnode path/yo/your/bin.js

它应该为您提供缺失的信息以解决问题并继续前进。

【讨论】:

node ./bin/appname 在 Express 4 中为我解决了这个问题 - 它给了我应用程序的正确错误(文件名大小写问题)。我也有错误的 Node.js 版本,不得不降级以解决我的特定问题 10.x.x 到 8.5.0(但我可能会在未来为 Node.js 10.x.x 解决这个问题)。【参考方案3】:

我们也遇到了类似的问题,即 pm2 几乎每秒都在重新启动一个进程以启动 node.js Web 应用程序。

我们发现 MongoDB 没有运行,然后 Web 应用程序会在启动时尝试连接到数据库但会失败。这会提示 pm2 一遍又一遍地重启进程,导致每秒重启一次。

如果这是您的问题,请尝试使用 mongodmongod --dbpath [your db path] 启动 MongoDB?

【讨论】:

【参考方案4】:

适用于您已使用 NPM 打包并启动应用的情况。

我只需要更改生态系统.configure.js 中的“脚本”文件(或者如果您使用的是 json 文件)。 app.js 不起作用,我不得不用 ./bin/www 替换它,然后它就起作用了。

【讨论】:

【参考方案5】:

请务必查看日志以了解问题所在(pm2 describe process 会告诉您它们的保存位置)。此外,通过停止 pm2 进程并手动运行您的应用程序(即npm run start),看看您是否可以在没有 pm2 的情况下运行 express 应用程序。

如果您可以手动运行应用程序但它不适用于 pm2,则可能是该应用程序没有从正确的目录运行(您可以使用 pm2 cwd 参数进行修改)。

另一个常见问题是未设置正确的环境变量,因此请检查您的 json 或 ecosystem file。也可以用pm2 prettylist查看pm2运行的环境。

【讨论】:

【参考方案6】:

我知道这有点晚了,除了滚动浏览此内容的任何人之外,经过数小时的研究,我找到了一个实际的解决方案。

所以我想分享这个找到的备忘单:https://devhints.io/pm2

pm2 start app.js --no-autorestart

【讨论】:

以上是关于Node.js pm2 几乎每秒都在重启的主要内容,如果未能解决你的问题,请参考以下文章

pm2操作总结

如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用

利用forever和pm2部署node.js

nodejs面试

Ubuntu 18.04 安装 pm2

如何使用jenkins重启PM2?