繁体   English   中英

'exit' - 在node.js集群中从master中杀死的工作进程中的事件

[英]'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.jskill -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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM