从Node中杀死java(Leiningen)进程

时间:2014-06-19 17:12:08

标签: java node.js process kill-process sigkill

我从NodeJS(通过java)启动了一堆child_process.spawn进程。从技术上讲,我发布了Leiningen(一个Clojure构建工具,lein)。后来我试图杀死他们和他们所有的孩子。但它几乎永远不会起作用,我得到的是一个充满java s的活动监视器(OSX)。

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

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

从命令行运行killall -9 java

2 个答案:

答案 0 :(得分:0)

问题在于孤立的java子子流程。有关解释和解决方案,请参阅本自述文件:https://github.com/indexzero/ps-tree

答案 1 :(得分:0)

我一直在做同样的事情,在不同的微服务上启动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}中,然后将其写入文件系统。由于我使用spawn('lein' ... etc)选项运行detached,因此我的当前节点进程可能会在不取消我的leiningen进程的情况下死亡。每当我恢复我的节点进程时,它都可以使用pid文件来查找和终止一个或多个项目。采用这种方法时,存在竞争条件的可能性,使得使用给定pid的lein进程已经死亡并且已经在该pid下开始新进程,我将留给其他人处理。