代码本身没有退出逻辑

听说自从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数值增加。
  1. 程序出现异常,未捕获,导致线程退出。
  1. Promise状态为rejected未捕获异常,导致线程退出。
  1. 发送退出信号,退出线程。 调用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()方法,导致应用退出。
 

 
Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP