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

标签 javascript node.js process kill

我想构建一个 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/

相关文章:

node.js - 如何使用 Nodejs 将父/子文档索引到 Elasticsearch 中?

c - 如何立即从 Linux 中的 fork 子进程返回?

bash - 如何将多个命令通过管道传输到 shell 中的单个命令? (嘘,庆典,...)

css - 如何为css/js文件设置缓存

javascript - 中间而不是末端的最大比例

javascript - 如何调试生产 Angular2/Typescript 应用程序?

node.js - 通过 id 查找 mongoose 数组中的对象

javascript - 在nodejs中将excel文件转换为json

java - 在 Java 中运行 Unix 命令

javascript - React Hook "useTranslation"在既不是 React 函数组件也不是自定义 React Hook 函数的函数 "getMyMenu"中被调用