比如我cluster了一个子进程,在子进程里故意写一个死循环,如何在master进程里杀掉这个子进程呢?试过kill(), disconnect(), send(‘shutdown’)都不行,只能直接master进程exit()。有啥办法可以杀掉吗?
理论上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,cluster
下worker.process
没有exit
函数啊
多谢狼叔,我试试
我试了下,这个tree-kill
把父进程也一起杀死了。。。我调用kill
的时候把master
和worker
的pid
都分别传入试过,每次都把所有进程都杀死了。其实我想要的效果只是杀死子进程而不杀死父进程,但这个组件是把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
进程就行了