From 2255be4d8e804746aad4994fe48a297e21e01e04 Mon Sep 17 00:00:00 2001 From: Scott Baker Date: Wed, 20 Apr 2011 15:51:21 +0000 Subject: [PATCH] fix problem parsing output of vps; add --memstatus command --- swapmon.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/swapmon.py b/swapmon.py index e2215b2..1076261 100755 --- a/swapmon.py +++ b/swapmon.py @@ -129,6 +129,7 @@ Options: --min-thresh=PERCENT Minimum physical memory utilization to be considered a hog --system-slice=SLICE System slice that should not be reset --status Print memory usage statistics and exit + --memstatus Print total memory, total swap, and swap used -h, --help This message """.lstrip() % (sys.argv[0], debug, verbose, DATAFILE, format_period(period)) @@ -150,12 +151,13 @@ def slicestat(names = None): # Mandatory fields. xid is a virtual field inserted by vps. Make # sure cmd is last so that it does not get truncated # automatically. - fields = ['pid', 'xid', 'vsize', 'sz', 'rss', 'pmem', 'cmd'] + fields = ['pid', 'xid', 'vsname', 'vsize', 'sz', 'rss', 'pmem', 'cmd'] # vps inserts xid after pid in the output, but ps doesn't know # what the field means. ps_fields = list(fields) ps_fields.remove('xid') + ps_fields.remove('vsname') slices = {} @@ -166,14 +168,10 @@ def slicestat(names = None): # Chomp newline line = line.strip() - # Replace "0 MAIN" and "1 ALL_PROC" (the special monikers that - # vps uses to denote the root context and the "all contexts" - # context) with "0" so that we can just split() on whitespace. - line = line.replace("0 MAIN", "0").replace("1 ALL_PROC", "0") - # Represent process as a dict of fields values = line.split(None, len(fields) - 1) if len(values) != len(fields): + print "slicestat: failed to parse line:", line continue proc = dict(zip(fields, values)) @@ -192,6 +190,7 @@ def slicestat(names = None): # cannot identify the context of an orphaned (usually dying) # process. Skip these processes. if (type(proc['xid']) != int) or (type(proc['vsize']) !=int): + print "slicestat: failed to parse line:", line continue # Assign (pl_)sshd processes to slice instead of root @@ -236,7 +235,7 @@ def slicestat(names = None): slice['rss'] += proc['rss'] slices[proc['xid']] = slice - + return slices def memtotal(): @@ -385,7 +384,7 @@ def main(): emailed = {} try: - longopts = ["debug", "verbose", "file=", "slice=", "status", "help"] + longopts = ["debug", "verbose", "file=", "slice=", "status", "memstatus", "help"] longopts += ["period=", "reset-thresh=", "reboot-thresh=", "min-thresh=", "system-slice="] (opts, argv) = getopt.getopt(sys.argv[1:], "dvf:s:ph", longopts) except getopt.GetoptError, err: @@ -417,6 +416,13 @@ def main(): elif opt == "--status": print summary(slicestat(names)) sys.exit(0) + elif opt == "--memstatus": + (mem, swap) = memtotal() + swap_pct = swap_used() + print "memory total:", mem + print "swap total:", swap + print "swap used:", swap_pct + sys.exit(0) else: usage() sys.exit(0) -- 2.43.0