簡體   English   中英

從Node殺死Java(Leiningen)進程

[英]Killing java (Leiningen) processes from Node

我正在通過child_process.spawn (通過child_process.spawn )啟動一堆java進程。 從技術上講,我正在啟動Leiningen(Clojure構建工具lein )。 后來我試圖殺死他們和他們所有的孩子。 但是它幾乎永遠無法工作,我得到的只是一個充滿java的活動監視器(OSX)。

我先運行thisProcess.kill(leinProcess.pid);殺死它們thisProcess.kill(leinProcess.pid); (默認為SIGTERM),等待1秒鍾,然后調用leinProcess.kill("SIGKILL");

所有進程和主進程都在同一用戶下運行。

從命令行運行killall -9 java

問題出在孤立的java子子進程上。 請參閱此自述文件以獲取解釋和解決方案: 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文件查找並終止一個或多個項目。 采用這種方法時,可能會出現競爭狀況,以至於帶有給定pid的lein過程已經死亡,並且在該pid下開始了一個新過程,我將留給別人處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM