代码本身没有退出逻辑
听说自从node14之后都会有这个问题
升级相关web框架版本
记录异常日志然后排查
同步中的异步操作,permission中catech可能出现异常,然后reslove,最外侧同步走异步操作要catch,不然出现异常错误直接挂掉
node频繁重启问题排查
系统通过pm2部署node,通过pm2 list命令观察状态时发现重启次数异常。
App name id | mode | pid | status | restart | uptime | cpu | mem | watching |
0 | cluster | 29430 | online | 217 | 32s | 0% | 33.9 MB | disabled |
1 | cluster | 29381 | online | 211 | 78s | 0% | 38.2 MB | disabled |
2 | cluster | 29078 | online | 185 | 8m | 0% | 49.1 MB | disabled |
3 | cluster | 29064 | online | 214 | 8m | 0% | 54.1 MB | disabled |
运行时间很短,但restart一栏数值过高。一般restart触发的条件主要有如下三条,当任意一条发生后,应用被重新拉起,那么restart数值增加。
- 程序出现异常,未捕获,导致线程退出。
- Promise状态为rejected未捕获异常,导致线程退出。
- 发送退出信号,退出线程。 调用process.ext()退出。
排查1,2两项后均正常,通过命令pm2 logs观察日志信息。登录到机器上输入pm2 logs,运行两分钟左右出现如下所需要的信息。
PM2 | App name:xxx id:1 disconnectedPM2 | 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:1PM2 | 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()方法,导致应用退出。
Loading...