首页 > 解决方案 > 为什么响应 SIGINT 信号的回调方法在进程终止之前没有完全完成?

问题描述

我正在尝试创建一种方式来优雅地关闭我的服务器,但似乎为响应 SIGINT 而调用的方法并未完全完成。

我已经使用向 SIGINT 信号添加了一个回调函数process.on('SIGINT', cb)

var stop = () => {
  console.log("stopping server");
  return new Promise((resolve, reject) =>
    server.close(() => { console.log("server closed"); resolve(); }))
    .then(() => new Promise((resolve, reject) => setTimeout(() => { console.log("time out finished"); resolve(); }, 5000)))
    .then(() => process.exit(0));
}

process.on("SIGINT", stop);

我在那里添加了 setTimeout 作为测试,以查看服务器是否在完全关闭之前等待。

当我向进程发送 SIGINT 时,我得到的输出是

stopping server

在少数情况下,停止服务器和服务器关闭日志都会出现,但并非总是如此。

我已经尝试从上一个问题中实现等待功能:如何防止 Node.js 在等待回调时退出?,但我仍然获得与上述相同的结果。

有谁知道一种解决方法,可以让这种方法在服务器退出之前完全完成?

标签: node.jsserver

解决方案


我在这方面遇到了真正的麻烦,并且使用承诺和回调似乎都不起作用。就我自己而言,我认为在我的 winston 记录器将所有信息保存到文件之前,进程队列已清空(并且节点已退出)。

无论如何,我最终通过为每个我想退出的进程手动设置标志来解决它,以便在完成后返回 true。退出本身的间隔为 100 毫秒,并且只会在所有标志为真时退出。

例如

process.on('SIGINT', exit);

function exit(){
    var myProcessFlag = myProcess.close()    //returns true once complete

    setInterval(function(){
        if(myProcessFlag == true){
            console.log('successful exit');
            process.exit(0);
        }
        else{
            console.log(`awaiting...
                         myProcess complete: ${myProcessFlag}`);
        }
    }, 100);
}

推荐阅读