请教一个PM2自动重启问题
发布于 7 年前 作者 im-here 20211 次浏览 来自 问答

前提:最近开发用到pm2来管理node进程,因为策划要经常修改配置表,于是我就用pm2 watch 了对应的策划对应的配置文件目录,这样一来当策划修改了配置表之后进程就自动重启。很好,这就是我想要的结果。

但是现在问题来了,pm2有2种模式:forkcluster 1.fork模式启动node进程:当策划修改配置表之后,能正常自动重启,而且重启之后node程序也能正常访问,唯一不足的就是如果我的程序里出现的uncaught error的时候,pm2会把错误日志写入app-out.log文件里而不是app-error.log文件里,这样就会导致当某一天我上来看到进程重启了,我不知道是策划修改配置表导致的,还是我程序里的uncaught error导致的; 2.cluster模式启动node进程:当程序里出现uncaught error的时候,pm2会把错误日志写入app-error.log文件,这样当我发现程序有重启的时候我只用看error.log里是否有日志就知道了。但是cluster有个问题就是它把node进程restart之后虽然pm2 list命令里看到的status是online但实际node进程是无法访问的。 我试过在cluster模式下手动执行pm2 restart app命令之后也是同样的效果。 试过几个pm2 版本从1.x到2.4.x都是这样。

我知道pm2的cluster模式是可以多启动几个进程以充分利用cpu,但是它restart之后进程并不能访问,那它restart的意义在哪呢? 请教各位前辈!

20 回复

启动集群式pm2 start app? 然后restart app就不行了?

@leiwei1991 对,restart命令执行之后,pm2 list查看对应的app status是online,同时restart次数也+1了,但是实际上这个被restart了的进程是不能访问的

app里配置列出来看下。你只启动了一个实例?

@leiwei1991 对,我只启动了一个实例。 我就用 pm2 start app.js -i 1 这样启动的,然后执行 pm2 restart app ,再pm2 list 看app对应的status是online,restart次数=1,但是这是这个进程就是不能访问

感觉有点问题 restart的话试下 pm2 restart app -i 1 或者 pm2 restart id(pm2 ls 里面的那个)。

@leiwei1991 restart id 试过了,一样的问题。 实际开发测试过程中,我如果用cluster启动一个进程,restart不是手动的啊,是watch或者uncaught error的时候重启的,所以就算 pm2 restart app -i 1 命令可行,也不可能执行这个命令啊。

配置一个a.json文件 pm2 start a.json即可. { “apps” : [{ “script” : “api.js”, “instances” : 0, “exec_mode” : “cluster” }] }

教程:http://pm2.keymetrics.io/docs/usage/cluster-mode/ @imhered

@leiwei1991 @DuanPengfei 我的配置文件是这样的

{
  "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
  }]
}

通过这个配置文件启动之后,不管是程序uncaught error导致restart或者watch restart的,pm2 list里看到的status 是online,restart次数也+1了,但是网站就是访问不了。。。

命令行指定参数与配置文件方式在本地我都尝试了,没有出现你所说的问题,PM2 版本 2.4.2,还是需要看看 PM2 的 log 而不仅仅是配置文件,这样的情况不是常规问题,基本只能依赖日志。

@DuanPengfei 我node进程监听的是1337端口,首先我正常启动,然后直接在服务器上curl 127..0.0.1:1337 没问题,能正常访问。但是当我执行pm2 restart app命令,或者是watch导致restart之后,再curl 127.0.0.1:1337 就一直访问不了了,日志里也没有任何记录。 我应该怎么查呢?

@imhered 你说这么多都没有用,解决不了问题,把日志贴出来看看,pm2 logs ${name 或 id},如果这里看不出来,打开 ~/.pm2/pm2.log 看看

@DuanPengfei 这是启动web的时候对应name下的log(gs.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

这是pm2.log里的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(web是我start.json里的name) gs.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

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 [26821], 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

exited with code [130] via signal [SIGINT] 是不是得从这句入手?

@imhered 看日志只看出了 App [gs] with id [0] and pid [26821], exited with code [130] via signal [SIGINT] 退出 code 是 130,Exit code 130: The job ran out of CPU or swap time. If swap time is the culprit, check for memory leaks.,具体为什么会出现这个原因得你自己好好查看一下了,还有就是配置文件中貌似少写了 watch: true,我尝试时填上了这个参数,可能跟你的配置有些区别了。

@DuanPengfei 非常感谢你的回答。 文中我用来测试,所以就没启用watch。 你的这个code对应的错误是在哪看的? pm2官网上吗?

@imhered 这个是 Linux exit code,网上搜到的,感觉也不一定准确,很多资料中给出的解释略有不同,你可以多搜索了解一下。Exit Codes With Special Meanings

@DuanPengfei The job ran out of CPU 看这句 我大概知道原因了。 我一个服务器上还跑了别的几个项目,总共加起来的进程数量已经超过了CPU数量。我尝试把别的进程关掉试试。

@DuanPengfei 刚才在一台2CPU,4内存的服务器上试了下,就只开了一个node进程。还是同样的表现,日志和上面的也一模一样。 =.= 不知道怎么查了

@imhered 如果按照我的思路会先启动一个 Express.js 或者 Koa.js 之类的 demo,然后观察结果,如果没问题就说明是自己代码导致的,再慢慢查代码,如果同样有问题就应该是 PM2 的问题了,尝试删除 PM2 再安装最新版本,还是不能解决问题,就带上自己的机器参数去提 issue 吧 😂

@DuanPengfei 好的,谢谢。也许是代码问题,先弄个最简答的demo试试。 因为我试了 4,5台机器 都是一样的效果😂

不要在windows下用cluster模式,在linux下一切是正常的

回到顶部