← 中文资源

简体中文版本

Node.js: 子进程被 SIGKILL 终止

诊断 Node 子进程被 SIGKILL 终止:区分 OOM 击杀、超时与在派生服务中信号处理缺失。

阅读英文原文

症状

被派生的子进程以 signal SIGKILL 终止,且没有任何清理逻辑运行。父进程在 exit 事件中看到 code 为 null、signal 为 SIGKILL,说明进程是被杀而非自行退出。

诊断

观察退出事件并检查内核日志:

const child = spawn('worker');
child.on('exit', (code, signal) => console.log({ code, signal }));
process.on('SIGTERM', () => { /* graceful shutdown */ });
dmesg | grep -i 'killed process'

若有 OOM 记录则说明是内存击杀;若无,则指向超时或手动 kill。

修复

收到 SIGTERM 时尽快退出,并让宽限期与之匹配:

process.on('SIGTERM', async () => {
  server.close();
  await drain();
  process.exit(0);
});

将容器停止超时设置得长于排空时间,从而无需 SIGKILL。

验证

发送 SIGTERM 并观察子进程以退出码而非信号结束;dmesg 无新的 OOM 击杀记录,确认关闭能在宽限期内完成,不再需要 SIGKILL。