如何杀死一个已经死循环的cluster子进程?
发布于 6 年前 作者 hwoarangzk 4906 次浏览 来自 问答

比如我cluster了一个子进程,在子进程里故意写一个死循环,如何在master进程里杀掉这个子进程呢?试过kill(), disconnect(), send(‘shutdown’)都不行,只能直接master进程exit()。有啥办法可以杀掉吗?

10 回复

理论上kill只是给子进程一个信号,至于怎么解读是子进程自己的事情,你如果写的是死循环那么他根本没机会处理任何东西。 换做 child.process.exit() 就可以了。

const cluster = require('cluster');
const fs = require('fs');

if (cluster.isMaster) {
  const sub = cluster.fork();
  setTimeout(sub.process.kill.bind(sub.process), 500);
} else {
  let i = 0;
  while (true) {
    fs.appendFileSync('/tmp/log', `${i += 1}\n`);
  }
}

child.process.exit is not a function,查了api,clusterworker.process没有exit函数啊

多谢狼叔,我试试

我试了下,这个tree-kill把父进程也一起杀死了。。。我调用kill的时候把masterworkerpid都分别传入试过,每次都把所有进程都杀死了。其实我想要的效果只是杀死子进程而不杀死父进程,但这个组件是把root process也杀死了

@hwoarangzk 我的代码在6.2.2下没问题,试过的,你的什么版本?

Sorry, 说错了,不是exit,就是kill,不过是 child.process.kill 不是 child.kill

var cluster = require('cluster');
var fs = require('fs');

if (cluster.isMaster) {
  var sub = cluster.fork();
  setTimeout(sub.process.kill.bind(sub.process), 500);
} else {
  while (true) {
    console.log('x');
  }
}

直接用这个代码测试,Node 4.x 6.x 都可以通过。功能也正常。

@stonephp 我是在windows下试的,待会儿我在linux上试试,多谢

@hwoarangzk 强烈建议玩Node.js远离windows, 除非你确定开发的东西真的最终要在win下运行。

确实啊,我换linux,发现没心跳直接kill进程就行了

回到顶部