我想优雅地从主进程退出子进程,其中主代码和子代码在不同的.js文件中。
master.js
cluster.setupMaster({
exec : 'child.js',
args : [],
silent : false
});
cluster.fork({'some': 'info'});
process.on('SIGINT', function() {
console.log('\nshutting down services ...');
function eachWorker(callback) {
for (var id in cluster.workers) {
callback(cluster.workers[id]);
}
}
eachWorker(function(worker) {
worker.kill();
});
process.exit(0);
})
child.js
cluster.worker.on('disconnect', function() {
console.log(cluster.worker.id + ' shutting down.');
})
我尝试了各种信号,cluster.worker.on('exit'),process.on('exit'),process.on('disconnect')等,但似乎没有触发。有什么想法吗?
worker.send()在执行期间工作,但不在SIGINT函数中?
答案 0 :(得分:5)
Node.js(或我的Mac)似乎处理ctrl-c和SIGINT略有不同。当我ctrl-c在主进程退出之前强制退出两个子进程。如果我在后台启动master.js
并kill -SIGINT [pid]
,代码会正确执行,孩子会收到通知,并且一切都很好。
您可以采取一些措施来解决这种情况。第一种是使用SIGINT而不是ctrl-c实际杀死。第二个是向子进程添加process.on('SIGINT')
。简单的事情:
process.on('SIGINT', function() { console.log('\nshutting down ...'); setTimeout(function() { console.log('quitting'); process.exit(0); }, 10000); });
会让孩子有时间正常关闭。 (显然目标是在10秒内退出)
要处理您想要的客户端上的消息:
var cluster = require('cluster'); var worker = cluster.worker; worker.on('message', function(msg) { console.log("message for worker: " ); console.log(msg); if (msg == "exit) ... });
在eachWorker(function...
worker.send("exit");
这可能实际上是node.js中的错误的结果。集群仍然是“实验性的”