#!/usr/bin/env bash # memusg -- Measure memory usage of processes # Usage: memusg COMMAND [ARGS]... # # Author: Jaeho Shin # 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= $$` command="$@" # 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 rm -f "histogram.mem.usg" # monitor the memory usage in the background. ( peak=0 while sizes=`sizes $pgid` do set -- $sizes sample=$((${@/#/+})) echo "$sample" >> "histogram.mem.usg" let peak="sample > peak ? sample : peak" sleep 0.1 done echo "memusg \`$command\`: peak=$peak kiloBytes" >> "peak.mem.usg" ) & monpid=$! echo "running: exec $@" # run the given command exec "$@"