CNode

如何杀死一个已经死循环的cluster子进程?

问答
Hhwoarangzk发布于10 年前最后回复10 年前10 回复6891 浏览0 收藏

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

查看回复

回复 (10)

S
stonephp#1·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`);
  }
}
H
hwoarangzk#2·10 年前

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

H
hwoarangzk#4·10 年前

多谢狼叔,我试试

H
hwoarangzk#5·10 年前

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

S
stonephp#7·10 年前

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

H
hwoarangzk#8·10 年前

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

S
stonephp#9·10 年前
引用 hwoarangzk@stonephp 我是在windows下试的,待会儿我在linux上试试,多谢

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

H
hwoarangzk#10·10 年前

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

参与回复
登录后即可参与回复。登录