如何杀死一个已经死循环的cluster子进程?
 发布于 9 年前  作者 hwoarangzk  6602 次预览  最后一次回复是 9 年前  来自 问答 

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

10 回复
stonephp

理论上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`);
  }
}
hwoarangzk

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

hwoarangzk

多谢狼叔,我试试

hwoarangzk

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

stonephp

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

stonephp

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 都可以通过。功能也正常。

hwoarangzk

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

stonephp

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

hwoarangzk

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