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

时间:2014-07-28 15:29:34

标签: 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

我也试过使用pstree,但我不想跟踪轻量级过程。有人可以帮助我,我怎样才能找到这个过程的大孩子。

3 个答案:

答案 0 :(得分:3)

function list_children {
    [[ $2 == --add ]] || LIST=()
    local ADD=() __
    IFS=$'\n' read -ra ADD -d '' < <(exec pgrep -P "$1")
    LIST+=("${ADD[@]}")

    for __ in "${ADD[@]}"; do
        list_children "$__" --add
    done
}

使用示例:

list_children "$PPID"
echo "Children: ${LIST[*]}"

for CHILD in "${LIST[@]}"; do
    top -c -b -n 1 -p "$CHILD"
done

答案 1 :(得分:2)

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

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

有了这个,你只能运行一次顶级-cbn 1并得到你需要的结果。

示例:

grep -f <(ps o ppid,pid | awk '$1==1{print $2" "}') <(top -cbn 1)
 1756 root      20   0  4096    4    0 S  0.0  0.0   0:00.00 /sbin/mingetty /dev/tty1                                                                  
 1758 root      20   0  4096    4    0 S  0.0  0.0   0:00.00 /sbin/mingetty /dev/tty2                                                                  
 1760 root      20   0  4096    4    0 S  0.0  0.0   0:00.00 /sbin/mingetty /dev/tty3                                                                  
 1762 root      20   0  4096    4    0 S  0.0  0.0   0:00.00 /sbin/mingetty /dev/tty4                                                                  
 1765 root      20   0  4108    4    0 S  0.0  0.0   0:00.00 /sbin/agetty /dev/hvc0 38400 vt100-nav                                                    
 1766 root      20   0  4096    4    0 S  0.0  0.0   0:00.00 /sbin/mingetty /dev/tty5                                                                  
 1769 root      20   0  4096    4    0 S  0.0  0.0   0:00.00 /sbin/mingetty /dev/tty6 

更新:如果你需要整个pid树,上面的命令只能获得直接的子pid:

grep -f <(pstree -cp <pid> | grep -Po '\(\K\d+'| sed -re 's/$/ /g' | sed -re 's/^/^\\s\*/g' ) <(top -cbn 1)

答案 2 :(得分:0)

您还可以结合使用awkps --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}'