| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- #!/usr/bin/env bash
- if [ $# -eq 0 ]; then
- echo "Usage: $0 <pid>"
- exit 1
- fi
- function print_vmrss() {
- declare -a arr
- arr=("$1" 0)
- total=0
- while [ ${#arr[@]} -gt 0 ]; do
- # remove last element
- space=${arr[${#arr[@]}-1]}
- unset arr[${#arr[@]}-1]
- pid=${arr[${#arr[@]}-1]}
- unset arr[${#arr[@]}-1]
- [ -d "/proc/$pid" ] || continue
- GREP_OPTS=${GREP_OPTS:-"
- --color=auto
- --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}
- "}
- mem=$(grep $GREP_OPTS VmRSS /proc/$pid/status \
- | grep $GREP_OPTS -o '[0-9]\+' \
- | awk '{print $1/1024}')
- #Add decimals to total
- total=$(echo $mem+$total | bc)
- # name of process
- name=$(ps -p $pid -o comm=)
- printf "%${space}s%s($pid): $mem MB\n" '' "$name"
- # get children
- children=$(pgrep -P $pid)
- # add children to array
- for child in $children; do
- arr+=("$child" $((space+2)))
- done
- done
- printf "Total: $total MB\n"
- }
- # check VMRSS_MONITOR = 1
- if [ ! -z "$VMRSS_MONITOR" ]; then
- while true; do
- if ps -p $1 > /dev/null
- then
- print_vmrss $1
- sleep 0.5
- else
- break
- fi
- done
- print_vmrss $1
- else
- print_vmrss $1
- fi
|