[英]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.