summaryrefslogtreecommitdiff
path: root/memusg
diff options
context:
space:
mode:
authorNathan Lasseter <Nathan Lasseter nathan@bytemark.co.uk>2015-09-18 11:51:28 +0100
committerNathan Lasseter <Nathan Lasseter nathan@bytemark.co.uk>2015-09-18 11:51:28 +0100
commitb0a14e013b318fa87714414b8ece95780527bddf (patch)
treea9427383ab6e38a4421c9c4313043f6dfcb8e90e /memusg
Initial commit
Diffstat (limited to 'memusg')
-rwxr-xr-xmemusg46
1 files changed, 46 insertions, 0 deletions
diff --git a/memusg b/memusg
new file mode 100755
index 0000000..e99dfdb
--- /dev/null
+++ b/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 "$@"