4

我想从主进程中优雅地退出一个子进程,其中主代码和子代码位于不同的 .js 文件中。

大师.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 函数内?

4

1 回答 1

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('\n正在关机...');
    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("给工人的信息:");
        控制台日志(味精);
        if (msg == "退出) ...
});

在你的eachWorker(function...

worker.send("退出");

这实际上可能是 node.js 中的错误的结果。集群仍然是“实验性的”

于 2013-11-05T18:55:29.097 回答