如果我有一个调用其他程序的脚本,我该如何定期检查脚本的内存使用情况?我不能只使用脚本的pid在pmap或ps上使用循环,因为脚本会产生其他进程(它们将拥有自己的pid和内存使用)。
有没有人知道一种很好的方法来获取脚本的总内存使用量,这将考虑脚本将产生的所有子进程?
谢谢!
答案 0 :(得分:0)
如果子进程没有自己的孩子,那很容易:
$ ps h --ppid "$PID" -o vsz | awk '{ SUM+=$0 }; END { print SUM }'
否则您可能依赖进程组ID(PGID),但值得确保您从脚本调用的程序不会设置自己的进程组。
$ ps h -e -o pgid,vsz | awk -v "PGID=$PID" '$1==PGID { SUM+=$2 }; END { print SUM }'
如果脚本的所有子节点都不属于同一个PGID,我们只能递归遍历进程:
$ cat ~/bin/vsztree
#!/bin/bash
declare -i VSZ_TOTAL
vsz() {
while read PID VSZ; do
VSZ_TOTAL+=$VSZ
vsz "$PID"
done < <(ps --ppid "$1" --format pid,vsz --no-headers)
}
vsz "$1"
echo $VSZ_TOTAL
$ vsztree "$PID"
此处$PID
是您脚本的PID。输出是以千字节为单位的总虚拟内存大小。