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

时间:2013-11-05 18:28:23

标签: javascript node.js

我想优雅地从主进程退出子进程,其中主代码和子代码在不同的.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函数中?

1 个答案:

答案 0 :(得分:5)

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中的错误的结果。集群仍然是“实验性的”