检查生成其他进程的bash脚本中的总内存使用情况

时间:2014-06-18 15:07:45

标签: linux bash memory-management

如果我有一个调用其他程序的脚本,我该如何定期检查脚本的内存使用情况?我不能只使用脚本的pid在pmap或ps上使用循环,因为脚本会产生其他进程(它们将拥有自己的pid和内存使用)。

有没有人知道一种很好的方法来获取脚本的总内存使用量,这将考虑脚本将产生的所有子进程?

谢谢!

1 个答案:

答案 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。输出是以千字节为单位的总虚拟内存大小。