此问题与节点模块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请求处理此问题。