从Node中杀死Java(Leiningen)进程

我从child_process.spawn启动了一堆java进程(通过child_process.spawn )。 从技术上讲,我正在启动Leiningen(一个Clojure构build工具, lein )。 后来我试图杀死他们和他们所有的孩子。 但它几乎从来没有工作,我得到的是一个活动监视器(OSX)充满了java的。

我杀了他们,首先运行thisProcess.kill(leinProcess.pid); (默认为SIGTERM),等待1秒,然后调用leinProcess.kill("SIGKILL");

所有进程和主进程都在同一个用户下运行。

从命令行运行killall -9 java工作。

问题是孤立的java子subprocess。 请参阅本自述文件以获取解释和解决scheme: https : //github.com/indexzero/ps-tree

我一直在做同样的事情,启动lein run在不同的微服务上lein run多个实例。 为了杀死他们,我一直在使用npm install tree-kill

基本例子

 var kill = require('tree-kill'); var spawn = require('child_process').spawn; var proc = spawn("lein", ["run"], {cwd: './some-dir', detached: true}); setTimeout(function(){kill(proc.pid); console.log('Take that!');}, 5000); 

更多真实的例子

 var kill = require('tree-kill'); var chalk = require('chalk'); exports.killIfAlive= function(pid) { try { kill(pid); } catch(ex) { console.error(ex); } }; exports.kill = function(projects) { var pids = exports.readPIDFile(); projects.forEach(function(project) { if (pids[project]) { console.log('Killing', chalk.cyan(project), chalk.magenta('(pid:', pids[project], ')')); exports.killIfAlive(pids[project]); } else { console.log(chalk.cyan(project), chalk.grey('is not running.')); } delete pids[project]; }); return exports.writePIDFile(pids); }; 

在启动每个项目后,我将它的pid存储到一个简单的对象{project1: 12352, project2: 50943} ,然后将其写入文件系统。 因为我用detached选项运行spawn('lein' ... etc) ,我的当前节点进程可以死掉,而无需取出我的leiningen进程。 每当我恢复我的节点进程,它可以使用pid文件来查找和终止一个或多个项目。 当采取这种方法时,有一个竞争条件的机会,使您的lein进程与给定的pid已经死亡,一个新的进程已经开始在该pid下,我将离开别人来处理。