我被赋予了一个任务来获取进程的子/孙的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
,但我不想跟踪轻量级过程。有人可以帮助我,我怎样才能找到这个过程的大孩子。
答案 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)
您还可以结合使用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}'