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