Linux 如何使用shell脚本获取进程的所有子进程或子进程的pid

Linux 如何使用shell脚本获取进程的所有子进程或子进程的pid,linux,shell,Linux,Shell,我被指派了一项任务,获取进程的子进程/子进程的cpu/内存利用率。可使用top命令找到。我写了一个脚本,它将获取进程的子进程,但我不确定如何递归地找到进程的所有子进程和子进程 #!/bin/bash ID=$PPID read PID < <(exec ps -o ppid= "$ID") for _child in $(pgrep -P "$PID"); do top -c -b -n 1 -p "$_child" done #/bin/bash ID=$PPID 读取P

我被指派了一项任务,获取进程的子进程/子进程的cpu/内存利用率。可使用
top
命令找到。我写了一个脚本,它将获取进程的子进程,但我不确定如何递归地找到进程的所有子进程和子进程

#!/bin/bash
ID=$PPID
read PID < <(exec ps -o ppid= "$ID")
for _child in $(pgrep -P "$PID"); do
    top -c -b -n 1 -p "$_child"
done
#/bin/bash
ID=$PPID

读取PID<在for循环中执行此操作很慢,请尝试以下操作:

grep -f <(ps o ppid,pid | awk '$1==<PID>{print $2" "}') <(top -cbn 1)

grep-f在for循环中执行此操作很慢,请尝试以下操作:

grep -f <(ps o ppid,pid | awk '$1==<PID>{print $2" "}') <(top -cbn 1)

grep-f您还可以将
awk
ps--forest
组合,以解析所有相关的PID:

ps f o pid,ppid | awk -v PID=$PARENT_PID '$1 == PID || pids[$2] == 1 {pids[$1]=1}; pids[$1] == 1 {print $1}'

您还可以将
awk
ps--forest
组合,以解析所有相关的PID:

ps f o pid,ppid | awk -v PID=$PARENT_PID '$1 == PID || pids[$2] == 1 {pids[$1]=1}; pids[$1] == 1 {print $1}'

谢谢你的回复。我不知道如何将此添加到现有脚本中。@Ashish您到底想做什么?谢谢您的回复。我不知道如何将此添加到我现有的脚本中。@Ashish你到底想做什么?
sudo ps
也许:
grep-f谢谢你的回复。你的脚本只获取直接子女。我今天尝试了你更新的命令,但它没有给出任何输出。它昨天起作用了,但你能检查一下更新的脚本吗?因为它今天没有给我任何输出。我也无法理解
sed-re的/^/^\\s\*/g'
正在做什么
sudo ps
可能:
grep-f谢谢你的回复。你的脚本只会带来直接的孩子。我今天尝试了你更新的命令,但它没有给出任何输出。它昨天起作用了,但你能检查一下更新的脚本吗?因为它今天没有给我任何输出。我也无法理解
sed-re的/^/^\\s\*/g'
在做什么
grep -f <(pstree -cp <pid> | grep -Po '\(\K\d+'| sed -re 's/$/ /g' | sed -re 's/^/^\\s\*/g' ) <(top -cbn 1)
ps f o pid,ppid | awk -v PID=$PARENT_PID '$1 == PID || pids[$2] == 1 {pids[$1]=1}; pids[$1] == 1 {print $1}'