请教一个PM2自动重启问题
发布于 8 年前 作者 im-here 21992 次预览 最后一次回复是 8 年前 来自 问答
前提:最近开发用到pm2来管理node进程,因为策划要经常修改配置表,于是我就用pm2 watch 了对应的策划对应的配置文件目录,这样一来当策划修改了配置表之后进程就自动重启。很好,这就是我想要的结果。
但是现在问题来了,pm2有2种模式:fork和cluster
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 我的配置文件是这样的
通过这个配置文件启动之后,不管是程序
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)
这是pm2.log里的log
我现在把日志清空,然后再执行
pm2 restart web(web是我start.json里的name) gs.log里的内容:pm2.log里的内容:
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下一切是正常的