在进程退出之前运行异步功能

时间:2018-01-24 22:57:51

标签: node.js process event-handling

我有一个用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

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 !`);
});