diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-06-11 16:45:33 -0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-06-11 16:45:33 -0300 |
commit | 0ff453fbc7f5c89e2622c27bfaf367945306d97a (patch) | |
tree | 8be6a42f049b9a6c9af546e6da5d943374bd1652 | |
parent | e4d5982c9f5deac4182ffb94821163831d173818 (diff) | |
download | python-linux-procfs-0ff453fbc7f5c89e2622c27bfaf367945306d97a.tar.gz |
pflags: Add command line utility to print processor flags
E.g.:
$ ./pflags-cmd.py ssh*,bash,6941
1278 sshd RANDOMIZE|SUPERPRIV|USED_ASYNC|USED_MATH
2692 bash RANDOMIZE|USED_ASYNC|USED_MATH
2919 bash RANDOMIZE|SUPERPRIV|USED_ASYNC|USED_MATH
3116 bash RANDOMIZE|USED_ASYNC|USED_MATH
3149 bash RANDOMIZE|USED_ASYNC|USED_MATH
3384 bash RANDOMIZE|USED_ASYNC|USED_MATH
3579 bash RANDOMIZE|USED_ASYNC|USED_MATH
3834 ssh RANDOMIZE|USED_ASYNC|USED_MATH
4372 bash RANDOMIZE|USED_ASYNC|USED_MATH
5024 bash RANDOMIZE|USED_ASYNC|USED_MATH
6339 bash RANDOMIZE|USED_ASYNC|USED_MATH
6941 vim FREEZER_SKIP|RANDOMIZE|USED_ASYNC|USED_MATH
$
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rwxr-xr-x | pflags-cmd.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/pflags-cmd.py b/pflags-cmd.py new file mode 100755 index 0000000..9228c68 --- /dev/null +++ b/pflags-cmd.py @@ -0,0 +1,65 @@ +#! /usr/bin/python +# -*- python -*- +# -*- coding: utf-8 -*- +# print process flags +# Copyright (C) 2015 Red Hat Inc. +# Arnaldo Carvalho de Melo <acme@redhat.com> +# +# This application is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; version 2. +# +# This application is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +import procfs, re, fnmatch, sys + +ps = None + +def thread_mapper(s): + global ps + + try: + return [ int(s), ] + except: + pass + try: + return ps.find_by_regex(re.compile(fnmatch.translate(s))) + except: + return ps.find_by_name(s) + +def main(argv): + + global ps + ps = procfs.pidstats() + + if (len(argv) > 1): + pids = reduce(lambda i, j: i + j, map(thread_mapper, argv[1].split(","))) + else: + pids = ps.processes.keys() + + pids.sort() + len_comms = map(lambda pid: len(ps[pid]["stat"]["comm"]), pids) + max_comm_len = max(len_comms) + del(len_comms) + + for pid in pids: + flags = ps[pid].stat.process_flags() + # Remove flags that were superseeded + if "PF_THREAD_BOUND" in flags and "PF_NO_SETAFFINITY" in flags: + flags.remove("PF_THREAD_BOUND") + if "PF_FLUSHER" in flags and "PF_NPROC_EXCEEDED" in flags: + flags.remove("PF_FLUSHER") + if "PF_SWAPOFF" in flags and "PF_MEMALLOC_NOIO" in flags: + flags.remove("PF_SWAPOFF") + if "PF_FREEZER_NOSIG" in flags and "PF_SUSPEND_TASK" in flags: + flags.remove("PF_FREEZER_NOSIG") + comm = ps[pid].stat["comm"] + flags.sort() + sflags = reduce(lambda i, j: "%s|%s" % (i, j), map(lambda a: a[3:],flags)) + print "%6d %*s %s" %(pid, max_comm_len, comm, sflags) + +if __name__ == '__main__': + main(sys.argv) |