请教一个 PM2 自动重启问题

2017-03-21 11:02:45 +08:00
 imherer

cluster模式启动 node 进程,配置文件如下

{
  "apps" : [{    
               "name"        	   : "web",
                "script"      	   : "./GServer/WebServer/app.js",
                "merge_logs"  	   : true,    
                "log_date_format"  : "YYYY-MM-DD HH:mm Z",
		"error_file"       : "/home/ubuntu/.pm2/logs/web-err.log",
		"out_file"         : "/home/ubuntu/.pm2/logs/web.log",
		"max_restarts"     : 15,
		"max_memory_restart": "1000M", 	
		"exec_mode"        : "cluster",
		"autorestart"      : true
  }]
}

当执行pm2 restart web或 watch 导致进程 restart 之后,pm2 list命令查看类别的时候,web进程的statusonline,同时 restart 次数也+1 了,但是这时候程序无法访问,包括在本机上直接curl 127.0.0.1:1337也无法访问( 1337 为我 node 监听的 port ).

下面是日志:

刚启动 node 进程的时候:

pm2 list命令:

┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode    │ pid   │ status │ restart │ uptime │ cpu │ mem       │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ web  │ 0  │ cluster │ 30986 │ online │ 0       │ 1s    │ 0%  │ 81.7 MB   │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘

web.log文件:

2017-03-20 20:26 +09:00: [2017-03-20 20:26:01.921] [INFO] logger -  [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337
2017-03-20 20:26 +09:00: [2017-03-20 20:26:01.924] [INFO] console - [info]-- [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337

web-error.log文件:无内容

pm2.log文件:

2017-03-20 20:25:58: [Watch] Start watching 0
2017-03-20 20:25:58: Starting execution sequence in -cluster mode- for app name:web id:0

接下来为了方便观察,我把所有日志都清空,然后执行pm2 restart web,让进程重启一次。

pm2 list命令:

┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode    │ pid   │ status │ restart │ uptime │ cpu │ mem       │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ web  │ 0  │ cluster │ 30986 │ online │ 1       │ 1m    │ 0%  │ 81.7 MB   │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘

虽然状态是online,但实际上 node 程序却不能访问

web.log文件:

2017-03-20 20:31 +09:00: [2017-03-20 20:31:40.636] [INFO] logger -  [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337
2017-03-20 20:31 +09:00: [2017-03-20 20:31:40.638] [INFO] console - [info]-- [ DotaServer <-> appDota.js ] : version = 0.3.8.2017320 , port = 1337

web-error.log文件:无内容

pm2.log文件:

2017-03-20 20:31:39: Stopping app:gs id:0
2017-03-20 20:31:39: App name:gs id:0 disconnected
2017-03-20 20:31:39: App [gs] with id [0] and pid [30986], exited with code [130] via signal [SIGINT]
2017-03-20 20:31:39: pid=26821 msg=process killed
2017-03-20 20:31:39: Starting execution sequence in -cluster mode- for app name:gs id:0
2017-03-20 20:31:39: App name:gs id:0 online

另外我如果用fork模式启动则完全没这个问题, restart 之后程序都能正常访问。主要是fork模式错误日志会计入 web.log 文件而不是 web-error.log 文件,这样非常不方便调试,所以我想用cluster模式。 另外我试过了 pm2 的 1.x 版本和 2.4.x 版本都是一样的结果。

3560 次点击
所在节点    Node.js
3 条回复
keller
2017-03-21 14:48:26 +08:00
pm2 用了好久也没发现这个问题
你可以添加多个 测试用例 看看是 pm2 问题还是你对应 app 有问题
fds
2017-03-21 14:52:24 +08:00
在 app.js 里 server.on "listening" 打印个 log ,看看是否确实启动了
imherer
2017-03-21 14:54:05 +08:00
@keller
@fds
解决了,发现是 node 版本太低了,应该是低版本没支持吧,换了高版本没问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/349065

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX