diff options
Diffstat (limited to 'memusg_git/memusg')
-rwxr-xr-x | memusg_git/memusg | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/memusg_git/memusg b/memusg_git/memusg new file mode 100755 index 0000000..9044a99 --- /dev/null +++ b/memusg_git/memusg @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# memusg -- Measure memory usage of processes +# Usage: memusg COMMAND [ARGS]... +# +# Author: Jaeho Shin <netj@sparcs.org> +# Created: 2010-08-16 +set -um + +# check input +[ $# -gt 0 ] || { sed -n '2,/^#$/ s/^# //p' <"$0"; exit 1; } + +# TODO support more options: peak, footprint, sampling rate, etc. + +pgid=`ps -o pgid= $$` +# make sure we're in a separate process group +if [ $pgid = $(ps -o pgid= $(ps -o ppid= $$)) ]; then + cmd= + set -- "$0" "$@" + for a; do cmd+="'${a//"'"/"'\\''"}' "; done + exec bash -i -c "$cmd" +fi + +# detect operating system and prepare measurement +case `uname` in + Darwin|*BSD) sizes() { /bin/ps -o rss= -g $1; } ;; + Linux) sizes() { /bin/ps -o rss= -$1; } ;; + *) echo "`uname`: unsupported operating system" >&2; exit 2 ;; +esac + +# monitor the memory usage in the background. +( +peak=0 +while sizes=`sizes $pgid` +do + set -- $sizes + sample=$((${@/#/+})) + let peak="sample > peak ? sample : peak" + sleep 0.1 +done +echo "memusg: peak=$peak" >&2 +) & +monpid=$! + + +# run the given command +exec "$@" |