Compare commits

..

No commits in common. "master" and "1.4" have entirely different histories.

2 changed files with 26 additions and 74 deletions

96
smem
View file

@ -21,7 +21,7 @@ class procdata(object):
def _list(self):
return os.listdir(self.source + "/proc")
def _read(self, f):
return open(self.source + '/proc/' + f).read()
return file(self.source + '/proc/' + f).read()
def _readlines(self, f):
return self._read(f).splitlines(True)
def _stat(self, f):
@ -170,7 +170,7 @@ def pidmaps(pid):
if options.mapfilter:
f = {}
for m in maps:
if not filters(options.mapfilter, m, lambda x: maps[x]['name']):
if not filter(options.mapfilter, m, lambda x: maps[x]['name']):
f[m] = maps[m]
return f
@ -227,7 +227,7 @@ def showamount(a, total):
return "%.2f%%" % (100.0 * a / total)
return a
def filters(opt, arg, *sources):
def filter(opt, arg, *sources):
if not opt:
return False
@ -240,7 +240,7 @@ def pidtotals(pid):
maps = pidmaps(pid)
t = dict(size=0, rss=0, pss=0, shared_clean=0, shared_dirty=0,
private_clean=0, private_dirty=0, referenced=0, swap=0)
for m in maps:
for m in maps.iterkeys():
for k in t:
t[k] += maps[m].get(k, 0)
@ -252,8 +252,8 @@ def pidtotals(pid):
def processtotals(pids):
totals = {}
for pid in pids:
if (filters(options.processfilter, pid, src.pidname, src.pidcmd) or
filters(options.userfilter, pid, pidusername)):
if (filter(options.processfilter, pid, src.pidname, src.pidcmd) or
filter(options.userfilter, pid, pidusername)):
continue
try:
p = pidtotals(pid)
@ -301,13 +301,13 @@ def showpids():
def maptotals(pids):
totals = {}
for pid in pids:
if (filters(options.processfilter, pid, src.pidname, src.pidcmd) or
filters(options.userfilter, pid, pidusername)):
if (filter(options.processfilter, pid, src.pidname, src.pidcmd) or
filter(options.userfilter, pid, pidusername)):
continue
try:
maps = pidmaps(pid)
seen = {}
for m in maps:
for m in maps.iterkeys():
name = maps[m]['name']
if name not in totals:
t = dict(size=0, rss=0, pss=0, shared_clean=0,
@ -366,8 +366,8 @@ def showmaps():
def usertotals(pids):
totals = {}
for pid in pids:
if (filters(options.processfilter, pid, src.pidname, src.pidcmd) or
filters(options.userfilter, pid, pidusername)):
if (filter(options.processfilter, pid, src.pidname, src.pidcmd) or
filter(options.userfilter, pid, pidusername)):
continue
try:
maps = pidmaps(pid)
@ -383,7 +383,7 @@ def usertotals(pids):
else:
t = totals[user]
for m in maps:
for m in maps.iterkeys():
for k in t:
t[k] += maps[m].get(k, 0)
@ -463,44 +463,11 @@ def showsystem():
showtable(range(len(l)), fields, columns.split(), options.sort or 'order')
def showfields(fields, f):
if type(f) in (list, set):
print("unknown fields: " + " ".join(f))
else:
print("unknown field %s" % f)
print("known fields:")
for l in sorted(fields):
print("%-8s %s" % (l, fields[l][-1]))
def autosize(columns, fields, rows):
colsizes = {}
for c in columns:
sizes = [1]
if not options.no_header:
sizes.append(len(fields[c][0]))
if (options.abbreviate or options.percent) and 'a' in fields[c][2]:
sizes.append(7)
else:
for r in rows:
sizes.append(len(str(fields[c][1](r))))
colsizes[c] = max(sizes)
overflowcols = set(["command", "map"]) & set(columns)
if len(overflowcols) > 0:
overflowcol = overflowcols.pop()
totnoflow = sum(colsizes.values()) - colsizes[overflowcol]
try:
ttyrows, ttycolumns = os.popen('stty size', 'r').read().split()
ttyrows, ttycolumns = int(ttyrows), int(ttycolumns)
except:
ttyrows, ttycolumns = (24, 80)
maxflowcol = ttycolumns - totnoflow - len(columns)
maxflowcol = max(maxflowcol, 10)
colsizes[overflowcol] = min(colsizes[overflowcol], maxflowcol)
return colsizes
if f != list:
print "unknown field", f
print "known fields:"
for l in sorted(fields.keys()):
print "%-8s %s" % (l, fields[l][-1])
def showtable(rows, fields, columns, sort):
header = ""
@ -519,17 +486,11 @@ def showtable(rows, fields, columns, sort):
mt = totalmem()
st = memory()['swaptotal']
missing = set(columns) - set(fields)
if len(missing) > 0:
showfields(fields, missing)
sys.exit(-1)
if options.autosize:
colsizes = autosize(columns, fields, rows)
else:
colsizes = {}
for n in columns:
if n not in fields:
showfields(fields, n)
sys.exit(-1)
f = fields[n][2]
if 'a' in f:
if n == 'swap':
@ -539,8 +500,6 @@ def showtable(rows, fields, columns, sort):
f = f.replace('a', 's')
else:
formatter.append(lambda x: x)
if n in colsizes:
f = re.sub(r"[0-9]+", str(colsizes[n]), f)
format += f + " "
header += f % fields[n][0] + " "
@ -559,10 +518,10 @@ def showtable(rows, fields, columns, sort):
return
if not options.no_header:
print(header)
print header
for k,r in l:
print(format % tuple([f(v) for f,v in zip(formatter, r)]))
print format % tuple([f(v) for f,v in zip(formatter, r)])
if options.totals:
# totals
@ -574,8 +533,8 @@ def showtable(rows, fields, columns, sort):
else:
t.append("")
print("-" * len(header))
print(format % tuple([f(v) for f,v in zip(formatter, t)]))
print "-" * len(header)
print format % tuple([f(v) for f,v in zip(formatter, t)])
def showpie(l, sort):
try:
@ -664,8 +623,6 @@ parser.add_option("-c", "--columns", type="str",
help="columns to show")
parser.add_option("-t", "--totals", action="store_true",
help="show totals")
parser.add_option("-a", "--autosize", action="store_true",
help="size columns to fit terminal size")
parser.add_option("-R", "--realmem", type="str",
help="amount of physical RAM")
@ -725,8 +682,7 @@ try:
showsystem()
else:
showpids()
except IOError:
_, e, _ = sys.exc_info()
except IOError, e:
if e.errno == errno.EPIPE:
pass
except KeyboardInterrupt:

4
smem.8
View file

@ -95,10 +95,6 @@ User filter regular expression.
.SS OUTPUT FORMATTING
.TP
.B \-a, \-\-autosize
Size columns to fit terminal size.
.TP
.BI "\-c " COLUMNS ", \-\-columns=" COLUMNS
Columns to show.