比如我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函数啊
child.process.exit is not a function
cluster
worker.process
exit
https://github.com/pkrumins/node-tree-kill
多谢狼叔,我试试
我试了下,这个tree-kill把父进程也一起杀死了。。。我调用kill的时候把master和worker的pid都分别传入试过,每次都把所有进程都杀死了。其实我想要的效果只是杀死子进程而不杀死父进程,但这个组件是把root process也杀死了
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进程就行了
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
理论上kill只是给子进程一个信号,至于怎么解读是子进程自己的事情,你如果写的是死循环那么他根本没机会处理任何东西。 换做 child.process.exit() 就可以了。
child.process.exit is not a function,查了api,cluster下worker.process没有exit函数啊https://github.com/pkrumins/node-tree-kill
多谢狼叔,我试试
我试了下,这个
tree-kill把父进程也一起杀死了。。。我调用kill的时候把master和worker的pid都分别传入试过,每次都把所有进程都杀死了。其实我想要的效果只是杀死子进程而不杀死父进程,但这个组件是把root process也杀死了@hwoarangzk 我的代码在6.2.2下没问题,试过的,你的什么版本?
Sorry, 说错了,不是exit,就是kill,不过是 child.process.kill 不是 child.kill
直接用这个代码测试,Node 4.x 6.x 都可以通过。功能也正常。
@stonephp 我是在windows下试的,待会儿我在linux上试试,多谢
@hwoarangzk 强烈建议玩Node.js远离windows, 除非你确定开发的东西真的最终要在win下运行。
确实啊,我换linux,发现没心跳直接
kill进程就行了