我必须在Nodejs上使用方法exec
因为我需要做一些stdout重定向并同时运行多个命令。所以我像这样运行子进程:
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来杀死孩子,就像我在下面的代码中那样。它在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上使用命令ps
,在Windows上使用命令wmic
。所以它是跨平台的。但它在我的情况下不起作用。有更好的方法吗?
我正在使用ps-tree
源代码进行探索,但我一无所获。
我使用process.kill
,因为我也在使用electron。
我恐怕应该尝试手动获取wmic
的所有进程列表。这就是ps-tree
正在尝试做的事情。
注意:模块tree-kill
在两个平台上都不起作用。
更新
好吧,我找到了一个丑陋的解决方法。我通过python代码os.getpid()
将我的python进程PID保存到外部文件中。有了这个,我可以像这样访问节点内有问题的PID:
const fs = require('fs');
fs.readFile(filePath, 'utf-8', function (err, data) {
process.kill(parseInt(data, 10));
app.quit();
});
答案 0 :(得分:2)
我为Windows回答,因为那是你遇到麻烦的那个。
看看你执行的命令,在我看来,你的两个命令的连接可能是罪魁祸首,所以我会尝试不用它。
如果你不能使用wmic是我所知道的最佳方式,那么你第一次必须手动检查是的。一旦你有了选择标准,你就可以自动关闭所有东西。
在进程繁忙时运行命令wmic process>processes.txt
之后使用编辑器检查文件processes.txt,并在列commandline
中查找要杀死的所有进程的公共字符串。
这将是您的选择标准。
由于创建进程的整个命令行都有路径和参数,因此这应该没有问题。
之后,您应该能够使用命令
关闭所有这些进程wmic process Where "CommandLine Like '%my_select_criterium%'" Call Terminate
我在Ruby脚本中使用这种技术,该脚本调用了一个我无法控制的糟糕行为java应用程序。