gpt4 book ai didi

node.js - 如何杀死 exec 在 Windows 上运行的子进程?

转载 作者:可可西里 更新时间:2023-11-01 09:27:50 24 4
gpt4 key购买 nike

我必须在 Nodejs 上使用 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像我在下面的代码中那样杀死 child 。它在 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 保存到一个外部文件中。有了这个,我可以像这样访问 Node 内有问题的 PID:

const fs = require('fs'); 
fs.readFile(filePath, 'utf-8', function (err, data) {
process.kill(parseInt(data, 10));
app.quit();
});

最佳答案

我回答 Windows,因为这是您遇到的麻烦。

看看你执行的命令,在我看来你的两个命令的串联可能是罪魁祸首,所以我会尝试不使用它。

如果你不能使用 wmic 是我所知道的最好的方法,第一次你将不得不手动检查是。一旦您有了选择标准,您就可以自动关闭所有内容。当进程忙时运行命令 wmic process>processes.txt之后使用编辑器检查文件 processes.txt 并在 commandline 列中查找要终止的所有进程的通用字符串。这将是您的选择标准。由于创建进程的整个命令行都包含路径和参数,因此应该没有问题。

之后你应该可以使用命令关闭所有这些进程

wmic process Where "CommandLine Like '%my_select_criterium%'" Call Terminate

我在 Ruby 脚本中使用了这种技术,该脚本调用了我无法控制的行为不佳的 Java 应用程序。

关于node.js - 如何杀死 exec 在 Windows 上运行的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com