Nicer process info from a separate proc.py module
[ais.git] / bin / proc.py
1 # -*- coding: utf-8 -*-
2
3 __proc_keys__ = (
4     # see man 5 proc
5     ('pid', int),
6     ('comm', str),
7     ('state', str),
8     ('ppid', int),
9     ('pgrp', int),
10     ('session', int),
11     ('tty_nr', int),
12     ('tpgid', int),
13     ('flags', int),
14     ('minflt', int),
15     ('cminflt', int),
16     ('majflt', int),
17     ('cmajflt', int),
18     ('utime', int),
19     ('stime', int),
20     ('cutime', int),
21     ('cstime', int),
22     ('priority', int),
23     ('nice', int),
24     ('num_threads', int),
25     ('itrealvalue', int),
26     ('starttime', int),
27     ('vsize', int),
28     ('rss', int),
29     ('rsslim', int),
30     ('startcode', int),
31     ('endcode', int),
32     ('startstack', int),
33     ('kstkesp', int),
34     ('kstkeip', int),
35     ('signal', int),
36     ('blocked', int),
37     ('sigignore', int),
38     ('sigcatch', int),
39     ('wchan', int),
40     ('nswap', int),
41     ('cnswap', int),
42     ('exit_signal', int),
43     ('processor', int),
44     ('rt_priority', int),
45     ('policy', int),
46     ('delayacct_blkio_ticks', int),
47     ('guest_time', int),
48     ('cguest_time', int),
49 )
50 __states__ = {
51     'R': 'running',
52     'S': 'sleeping',
53     'D': 'disk sleep',
54     'Z': 'zombie',
55     'T': 'stoped',
56     'W': 'paging',
57 }
58
59 class Stat(dict):
60     def __init__(self, processid):
61         dict.__init__(self)
62         strstats = file('/proc/%s/stat' % processid).read()
63         # TODO:
64         # "getconf CLK_TCK" = 100 -> 1 tick = 1/100 seconds
65         strstats = strstats.rstrip('\n').split(' ')
66         for i, keycls in enumerate(__proc_keys__):
67             key, cls = keycls
68             self[key] = cls(strstats[i])
69
70     def nice_state(self):
71         state = self['state']
72         nice_state = __states__.get(state, None)
73         if not nice_state:
74             return state
75         return "%s (%s)" % (state, nice_state)
76     
77     # TODO: 
78     # "getconf CLK_TCK" = 100 -> 1 tick = 1/100 seconds
79     def nice_utime(self):
80         return self['utime'] / 100.
81
82     def nice_stime(self):
83         return self['stime'] / 100.