node.js - 为什么响应 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 在等待回调时退出?,但我仍然获得与上述相同的结果。
有谁知道一种解决方法,可以让这种方法在服务器退出之前完全完成?
解决方案
我在这方面遇到了真正的麻烦,并且使用承诺和回调似乎都不起作用。就我自己而言,我认为在我的 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);
}
推荐阅读
- database - 将 gc_grace_seconds 10 更改为 0 天后,Cassandra 上的主要压缩
- android - 使用 RxJava2 更改数据库中的项目状态
- labview - 使用 LabVIEW 2018 将前面板屏幕截图转换为 base64 字符串
- list - Flutter - 如何查询列表中的搜索项
- javascript - Angular 7 过滤器阵列
- javascript - 通过 Chrome 扩展程序跟踪第三方网站的点击次数
- javascript - 使用引导程序日期选择器显示特定范围的年、月和日
- vue.js - VueJS - 实例上未定义属性或方法“currentUser”
- java - Apache Beam java 测试 ExpectedLogs Maven
- c - C 中的结构、城市和距离、图形和 Dijkstras