#!/usr/bin/env python

"""find-max-ram - Returns the maximum amount of memory used by a program.

Every half second, run ps with the appropriate commands, getting the
size of the program.  Return max value.

"""

import os, sys, time

def get_val(cmdstr):
	"""Runs ps and gets sum rss for processes making cmdstr

	Returns None if process not found.

	"""
	cmd = ("ps -Ao cmd -o rss | grep '%s' | grep -v grep" % cmdstr)
#	print "Running ", cmd
	fp = os.popen(cmd)
	lines = fp.readlines()
	fp.close()

	if not lines: return None
	else: return reduce(lambda x,y: x+y, map(read_ps_line, lines))
	
def read_ps_line(psline):
	"""Given a specially formatted line by ps, return rss value"""
	l = psline.split()
	assert len(l) >= 2 # first few are name, last one is rss
	return int(l[-1])


def main(cmdstr):
	while get_val(cmdstr) is None: time.sleep(0.5)

	current_max = 0
	while 1:
		rss = get_val(cmdstr)
		print rss
		if rss is None: break
		current_max = max(current_max, rss)
		time.sleep(0.5)

	print current_max


if __name__=="__main__":

	if len(sys.argv) != 2:
		print """Usage: find-max-ram [command string]

	It will then run ps twice a second and keep totalling how much RSS
	(resident set size) the process(es) whose ps command name contain the
	given string use up.  When there are no more processes found, it will
	print the number and exit.
	"""
		sys.exit(1)
	else: main(sys.argv[1])
	
