在 bash 中查找进程的所有后代的数量

In bash find number of all descendants of a process

假设我有一个有六个后代的虚拟进程。

pstree -pc 101

dummy(101)──dummy(102)──dummy(103)──dummy(104)──dummy(105)──dummy(106)──sleep(107)

如何在 bash 中获取上述 pid 101 的数字 6?

更新: 链上产品我在下面使用 bash 脚本(dummy.sh),这是对同一脚本的递归调用。

#!/bin/bash

if [[ "$#" -ne 1 ]]; then
    set -- 7
fi

if [[ "" -gt 2 ]]; then
    echo 'descendant process' ""
    "[=12=]" "$(( - 1))"
else
    sleep 500
fi

注意:我想获取任何进程的后代数量,而不仅仅是上面的示例。以上是由 bash 终端生成的,因此它的 pstree 链看起来像 pstree -pc 100。如果我给输入 100 脚本应该 return 7(因为它有七个后代)

bash(100)──dummy(101)──dummy(102)──dummy(103)──dummy(104)──dummy(105)──dummy(106)──sleep(107)

试试这个(1192是我的systemd进程,替换成你想查看的进程号):

pstree -pc 1192 | grep -coP '\(\K[^\)]+'

显示的总数包括 parent 个进程。做 -1 只得到 children.

假设 pstree 的输出格式类似于:

systemd(1)-+-ModemManager(814)-+-{ModemManager}(828)
           |                   `-{ModemManager}(831)
           |-NetworkManager(685)-+-{NetworkManager}(787)
           |                     `-{NetworkManager}(791)
           |-accounts-daemon(664)-+-{accounts-daemon}(682)
           |                      `-{accounts-daemon}(789)
           |-acpid(666)

遗憾的是 pstree 没有 return 版本号,所以我无法与您的版本进行比较。

我想你正在寻找这样的东西:

pstree -pcA 101 | awk 'BEGIN { RS="---"; FS="[()]" } FNR==1 { var=; ++n; next } ==var { ++n } END { print n }'

[编辑]

适用于不同的 parent 的名字。

pstree -pcA 29076 | awk 'BEGIN { RS="---"; FS="[()]"; ++n } FNR==2 { var=; ++n } FNR>2 && ==var { ++n } END { print n }'