from __future__ import print_function
import sys
import psutil
if not (psutil.LINUX or psutil.OSX or psutil.WINDOWS):
sys.exit("platform not supported")
def convert_bytes(n):
symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
prefix = {}
for i, s in enumerate(symbols):
prefix[s] = 1 << (i + 1) * 10
for s in reversed(symbols):
if n >= prefix[s]:
value = float(n) / prefix[s]
return '%.1f%s' % (value, s)
return "%sB" % n
def main():
ad_pids = []
procs = []
for p in psutil.process_iter():
with p.oneshot():
try:
mem = p.memory_full_info()
info = p.as_dict(attrs=["cmdline", "username"])
except psutil.AccessDenied:
ad_pids.append(p.pid)
except psutil.NoSuchProcess:
pass
else:
p._uss = mem.uss
p._rss = mem.rss
if not p._uss:
continue
p._pss = getattr(mem, "pss", "")
p._swap = getattr(mem, "swap", "")
p._info = info
procs.append(p)
procs.sort(key=lambda p: p._uss)
templ = "%-7s %-7s %-30s %7s %7s %7s %7s"
print(templ % ("PID", "User", "Cmdline", "USS", "PSS", "Swap", "RSS"))
print("=" * 78)
for p in procs[:86]:
line = templ % (
p.pid,
p._info["username"][:7],
" ".join(p._info["cmdline"])[:30],
convert_bytes(p._uss),
convert_bytes(p._pss) if p._pss != "" else "",
convert_bytes(p._swap) if p._swap != "" else "",
convert_bytes(p._rss),
)
print(line)
if ad_pids:
print("warning: access denied for %s pids" % (len(ad_pids)),
file=sys.stderr)
if __name__ == '__main__':
sys.exit(main())