node.js频繁重启问题排查

Node.js应用频繁重启之谜
本文记录了一次Node.js应用频繁重启的问题排查过程。通过分析PM2的日志信息,发现重启是由进程内部调用了process.exit()导致的,并最终定位到了问题的根源在于代理中的JS脚本执行了非法的process.exit()操作。

node频繁重启问题排查

系统通过pm2部署node,通过pm2 list命令观察状态时发现重启次数异常。

App name idmodepidstatusrestartuptimecpumemwatching
0cluster29430online21732s0%33.9 MBdisabled
1cluster29381online21178s0%38.2 MBdisabled
2cluster29078online1858m0%49.1 MBdisabled
3cluster29064online2148m0%54.1 MBdisabled

运行时间很短,但restart一栏数值过高。一般restart触发的条件主要有如下三条,当任意一条发生后,应用被重新拉起,那么restart数值增加。

  1. 程序出现异常,未捕获,导致线程退出。
  2. Promise状态为rejected未捕获异常,导致线程退出。
  3. 发送退出信号,退出线程。 调用process.ext()退出。

排查1,2两项后均正常,通过命令pm2 logs观察日志信息。登录到机器上输入pm2 logs,运行两分钟左右出现如下所需要的信息。

PM2 | App name:xxx id:1 disconnected
PM2 | App [xxx] with id [1] and pid [16508], exited with code [0] via signal [SIGINT]
PM2 | Starting execution sequence in -cluster mode- for app name:xxx id:1
PM2 | App name:xxx id:1 online

发现 exited with code [0],看到是正常退出。但代码本身没有退出逻辑。于是判断process.exit()被调用,触发应用退出,随后对exit事件监听。

process.on(‘exit’, (code) => {
console.log(About to exit with code: ${code});
});

观察调用栈,发现调用栈中执行的js脚本有问题。原来代理里有eval执行脚本,而脚本里还包含了process.exit()方法,导致应用退出。

总结

退出问题排查,要清楚导致退出可能发生的原因,再尝试捕获相关参数,如退出码,定位并发现问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值