此问题与节点模块throng有关。
如节点文档中所述,当在SIGINT或/和SIGTERM上定义侦听器时,节点应防止退出。但是throng将始终退出。


  如果这些信号之一已安装侦听器,则其默认行为
  将被删除(Node.js将不再退出)。


https://nodejs.org/api/process.html#process_signal_events

如何繁殖

使用GitHub上的默认示例并注释掉process.exit行,节点仍将退出该过程。

const throng = require('./lib/throng');

throng({
  workers: 1,
  master: startMaster,
  start: startWorker
});

// This will only be called once
function startMaster() {
  console.log(`Started master`);
}

// This will be called four times
function startWorker()(id) {
  console.log(`Started worker ${ id }`);

  process.on('SIGTERM', () => {
    console.log(`Worker ${ id } exiting...`);
    console.log('(cleanup would happen here)');
    //process.exit();
  });
}


在macOS 10.12.3,NodeJS 7.7.3和4.0.0上进行了测试

在没有startWorker的情况下测试throng方法将起作用。这个过程不会停止。因此,这在throng上一定是一个问题。

有没有人对throng有这样的经验,可以向我解释这种行为?

最佳答案

这肯定是一个错误,因为开发人员完全按照其模块说明和示例进行指定。
但是,我认为它从一开始就无法正常工作,因为当主进程关闭时,所有子进程将自动终止。没有提供等待子进程结束的信息。
开发人员似乎已经意识到这一点。有gint 2 pull请求处理此问题。

08-28 10:26