我必须在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以外的其他特征来识别它们,你可以相应地过滤结果。 –