我有一个用Node.js编写的简单shell脚本,我试图在进程退出(^ C)之前进行一些清理。我已经编写了以下代码,但由于某种原因,清理功能还没有完成。有什么想法吗?
if (keepAlive) {
process.stdin.resume();
['exit', 'SIGINT'].forEach(function(signal) {
process.on(signal, function() {
console.log("Received Signal: '" + signal + "'. Cleaning up...");
cleanup(function(err) {
console.log('this function is called but does not finish')
process.exit();
});
});
});
else {
process.exit();
}
我使用的是Node v6.9.2
答案 0 :(得分:1)
您无法可靠地从process.on('exit')
运行异步代码。以下是文档的引用:
此时无法阻止退出事件循环,并且一旦所有“退出”侦听器都已完成运行,Node.js进程将终止。
因此,一旦退出侦听器返回(即使它仍在尝试完成它的异步处理),该进程将退出。
对于SIGINT处理程序,您应该能够执行任何操作,因为一旦注册了SIGINT处理程序,就没有默认行为可以退出进程,因此只有在您告知进程时才会退出该进程。来自doc:
如果其中一个信号[SIGINT或SIGTERM]安装了侦听器,其默认行为将被删除(Node.js将不再退出)。
这意味着如果您正确编写异步处理代码(在问题中未显示),则应该能够在异步处理完成后退出。
答案 1 :(得分:0)
您可以这样做:
process.on("SIGTERM", () => {
ayncFunction().finally(() => process.exit(0));
});
process.on("SIGINT", () => {
ayncFunction().finally(() => process.exit(0));
});
process.on("exit", code => {
console.log(`APP stopped !`);
});