在 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 }'
假设我有一个有六个后代的虚拟进程。
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 }'