gpt4 book ai didi

javascript - Node : get child processes of a daemon and kill them

转载 作者:行者123 更新时间:2023-12-05 05:16:11 24 4
gpt4 key购买 nike

我想构建一个 Node 应用程序,它允许我将 kill -9 发送到一个守护进程的所有子进程。

要清楚。我们的服务器上有一个守护进程。在一开始,它启动了一个与我们的客户沟通的过程。

当客户端向服务器发送新作业时,守护进程会创建一个新的子进程。

所以现在我想获取守护进程的所有子进程,kill -9 它们,然后使用 systemctl restart mydaemon.service 重启守护进程

我搜索了谷歌,但没有找到适合我的问题的内容。

我要说的是,我想在不知道守护进程 process-id 的情况下解决这个问题,当然是在可能的情况下。

为什么我需要这个

为什么我需要这样做是因为守护进程所属的软件存在错误。我上面提到的沟通过程失败了,就这样消失了。卖家说只要重启守护进程就可以杀死所有进程,当然不是。因此,由于卖家无法为我们的问题提供任何解决方案,因此目前以我现在想要自动化的方式重新启动服务。用 SIGKILL 杀死所有 child ,然后重新启动守护进程。

非常感谢你们。

最佳答案

您可以使用 pstree 实用程序(递归地)找到所有子进程。很可能需要安装它。例如,在 Mac 上,您可以执行以下操作:brew install pstree

然后你可以运行这个片段来找到所有的子进程并杀死它们:

const child_process = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(child_process.exec);

(async () => {
const pids = await execAsync(
`pstree ${process.pid} | sed 's/[^0-9]*\\([0-9]*\\).*/\\1/' | grep -v "${process.pid}"`
);

// Join the pids into one line separated by space
const pidsString = pids.stdout.replace(/[\r\n]+/g, ' ');

await execAsync(`kill -9 ${pidsString} || true`);
})();

详细解释如下:

  • pstree ${process.pid} - 返回所有子进程的树。输出如下所示: enter image description here

  • sed 's/[^0-9]*\\([0-9]*\\).*/\\1/' - 只保留 pids,删除其余字符串

  • grep -v "${process.pid}" - 从列表中删除当前进程,我们不想杀死它

  • kill -9 ${pidsString} || true - 使用 SIGKILL 终止子进程。

我必须做 || true 因为 pstree 返回一个完整的进程列表,包括它自己(它还在内部生成 ps)。这些进程在我们开始终止时已经结束,因此我们需要它来抑制 No such process 错误。

关于javascript - Node : get child processes of a daemon and kill them,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50702034/

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