我必須在Nodejs上使用exec
方法,因爲我需要執行一些stdout重定向並同時運行多個命令。於是我運行子進程是這樣的:我該如何殺死Windows上由exec運行的子進程?
let shell = null;
const child_process = require('child_process')
var command = 'activate python_environment & bokeh serve project_folder/ log/logger.log 2>&1';
shell = child_process.exec(command);
我需要ps-tree我在belower代碼做殺死這些孩子。它在Ubuntu上運行良好。但問題是如果我不殺死子進程,我會在Windows上得到一個孤兒(殭屍)進程。
const psTree = require('ps-tree')
app.on('window-all-closed', function() {
electron.app.quit()
if(shell != null){
psTree(shell.pid, function (err, children) {
children.map(function (p) {
process.kill(p.PID);
});
});
}
});
的ps-tree
模塊使用Linux和Windows上的命令wmic
命令ps
。所以它是跨平臺的。但這對我來說不起作用。有一個更好的方法嗎?
我在探索ps-tree
源代碼,但是我什麼也沒找到。
我使用process.kill
,因爲我也使用electron。
我恐怕我應該嘗試手動獲取所有進程列表wmic
。這就是ps-tree
正在嘗試做的事情。
注意:模塊tree-kill
在兩個平臺上都不起作用。
更新
好吧,我發現了一個醜陋的解決方法。我通過python代碼os.getpid()
將我的python進程PID保存到外部文件中。因爲這是你有麻煩的一個
const fs = require('fs');
fs.readFile(filePath, 'utf-8', function (err, data) {
process.kill(parseInt(data, 10));
app.quit();
});
看起來很危險 - 進程ID被重用,所以你可以殺死偶然的進程,碰巧有一個父進程ID與你的shell相同。處理流程樹最穩健的方法是使用作業對象。如果'節點。js'不支持,你可以編寫一個C程序來代表你運行子命令。 –
「工作對象」是什麼意思?我想要做的是殺死shell進程及其子進程,我想殺死完整的樹。之後,其他進程可以重用進程ID – ChesuCR
您可以使用作業對象來跟蹤進程樹,也可以使用它來殺死所有進程。 [看到這裏。](http://stackoverflow.com/search?q=JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)不幸的是,這並不簡單。使用'ps-tree'的風險是shell進程的進程ID可能以前屬於其他進程。你會殺死進程中的所有子進程以及進程樹中的子進程。我想如果你能通過除了父PID以外的其他特徵來識別它們,你可以相應地過濾結果。 –