【问题标题】:'exit'-Event in worker process when killed from master within a node.js cluster'exit'-从 node.js 集群中的 master 杀死时工作进程中的事件
【发布时间】:2013-11-05 18:28:22
【问题描述】:

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

ma​​ster.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 函数内?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    Node.js(或我的 Mac)似乎处理 ctrl-c 和 SIGINT 略有不同。当我 ctrl-c 两个子进程在主进程退出之前被强制退出。如果我在后台启动master.jskill -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("给工人的信息:"); 控制台日志(味精); 如果 (msg == "退出) ... });

    在你的eachWorker(function...

    worker.send("退出");

    这实际上可能是 node.js 中的错误的结果。集群仍处于“实验阶段”

    【讨论】:

    • 我添加了更多关于产卵的信息。当我将 worker.send() 放在 master.js 代码中的某个位置时,worker.send() 有效,但不在 SIGINT 过程中。
    • 我在尝试了一些东西后得出了同样的结论。在所有工作人员断开连接后,您可以使用 cluster.disconnect([callback]) 代替消息继续。似乎有效。
    • 这对 gulp-nodemon w/ express 集群有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多