[英]'exit'-Event in worker process when killed from master within a node.js cluster
我想优雅地从主进程退出子进程,其中主代码和子代码在不同的.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函数内?
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中的错误的结果。 集群仍然是“实验性的”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.