症状
被派生的子进程以 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。