nodejs:获取守护进程的子进程并终止它们

时间:2018-06-05 14:00:18

标签: javascript node.js process kill

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

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

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

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

重启守护进程

我搜索了谷歌并没有发现任何符合我问题的内容。

我需要说的是,我想在不知道守护进程进程ID的情况下解决这个问题,当然只有在可能的情况下才能解决。

为什么我需要这个

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

非常感谢你们。

1 个答案:

答案 0 :(得分:0)

您可以使用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错误。