Nicer process info from a separate proc.py module
authorJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Sat, 13 Nov 2010 02:01:17 +0000 (02:01 +0000)
committerJean-Michel Nirgal Vourgère <jmv@nirgal.com>
Sat, 13 Nov 2010 02:01:17 +0000 (02:01 +0000)
bin/djais/models.py
bin/proc.py [new file with mode: 0644]
html_templates/job.html

index e73ff49162ff63bad8ed56eb3cbb98ee64e009d1..a6e3d3e29dcad04ba81edbb560886cd240aaff45 100644 (file)
@@ -9,6 +9,7 @@ from django.contrib.auth.models import get_hexdigest
 from django.utils import html
 
 from ais.common import Nmea, mmsi_to_strmmsi, nice_timedelta_str
+from ais import proc
 
 class UserMessageCategory(models.Model):
     id = models.CharField(max_length=10, primary_key=True)
@@ -236,18 +237,10 @@ class Job(models.Model):
         return nice_timedelta_str(dt)
 
     def get_stats(self):
-        result = {}
         try:
-            strstats = file('/proc/%s/stat' % self.pid).read()
+            return proc.Stat(self.pid)
         except:
             return
-        # man 5 proc
-        # TODO:
-        # "getconf CLK_TCK" = 100 -> 1 tick = 1/100 seconds
-        strstats = strstats.rstrip('\n').split(' ')
-        for i, key in enumerate(('pid', 'comm', 'state', 'ppid', 'pgrp', 'session', 'tty_nr', 'tpgid', 'flags', 'minflt', 'cminflt', 'majflt', 'cmajflt', 'utime', 'stime', 'cutime', 'cstime', 'priority', 'nice', 'num_threads', 'itrealvalue', 'starttime', 'vsize', 'rss', 'rsslim', 'startcode', 'endcode', 'startstack', 'kstkesp', 'kstkeip', 'signal', 'blocked', 'sigignore', 'sigcatch', 'wchan', 'nswap', 'cnswap', 'exit_signal', 'processor', 'rt_priority', 'policy', 'delayacct_blkio_ticks', 'guest_time', 'cguest_time')):
-            result[key] = strstats[i]
-        return result
     
     def get_sucess_size(self):
         extension = os.path.splitext(self.friendly_filename)[-1]
diff --git a/bin/proc.py b/bin/proc.py
new file mode 100644 (file)
index 0000000..cdedb05
--- /dev/null
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+
+__proc_keys__ = (
+    # see man 5 proc
+    ('pid', int),
+    ('comm', str),
+    ('state', str),
+    ('ppid', int),
+    ('pgrp', int),
+    ('session', int),
+    ('tty_nr', int),
+    ('tpgid', int),
+    ('flags', int),
+    ('minflt', int),
+    ('cminflt', int),
+    ('majflt', int),
+    ('cmajflt', int),
+    ('utime', int),
+    ('stime', int),
+    ('cutime', int),
+    ('cstime', int),
+    ('priority', int),
+    ('nice', int),
+    ('num_threads', int),
+    ('itrealvalue', int),
+    ('starttime', int),
+    ('vsize', int),
+    ('rss', int),
+    ('rsslim', int),
+    ('startcode', int),
+    ('endcode', int),
+    ('startstack', int),
+    ('kstkesp', int),
+    ('kstkeip', int),
+    ('signal', int),
+    ('blocked', int),
+    ('sigignore', int),
+    ('sigcatch', int),
+    ('wchan', int),
+    ('nswap', int),
+    ('cnswap', int),
+    ('exit_signal', int),
+    ('processor', int),
+    ('rt_priority', int),
+    ('policy', int),
+    ('delayacct_blkio_ticks', int),
+    ('guest_time', int),
+    ('cguest_time', int),
+)
+__states__ = {
+    'R': 'running',
+    'S': 'sleeping',
+    'D': 'disk sleep',
+    'Z': 'zombie',
+    'T': 'stoped',
+    'W': 'paging',
+}
+
+class Stat(dict):
+    def __init__(self, processid):
+        dict.__init__(self)
+        strstats = file('/proc/%s/stat' % processid).read()
+        # TODO:
+        # "getconf CLK_TCK" = 100 -> 1 tick = 1/100 seconds
+        strstats = strstats.rstrip('\n').split(' ')
+        for i, keycls in enumerate(__proc_keys__):
+            key, cls = keycls
+            self[key] = cls(strstats[i])
+
+    def nice_state(self):
+        state = self['state']
+        nice_state = __states__.get(state, None)
+        if not nice_state:
+            return state
+        return "%s (%s)" % (state, nice_state)
+    
+    # TODO: 
+    # "getconf CLK_TCK" = 100 -> 1 tick = 1/100 seconds
+    def nice_utime(self):
+        return self['utime'] / 100.
+
+    def nice_stime(self):
+        return self['stime'] / 100.
index a1c2fd8eaf563f5bec96eb0692c2f25467bd4e4f..643d4270a56654a646d3b43295dc2e29ff9fd2ba 100644 (file)
@@ -22,15 +22,10 @@ Result size: {{ job.get_sucess_size|filesizeformat }}<br>
         Process ID: {{ stats.pid }}<br>
         CPU ID: {{ stats.processor }}<br>
         Nice: {{ stats.nice }}<br>
-        State: {{ stats.state }}<br>
+        State: {{ stats.nice_state }}<br>
         Virtual size: {{ stats.vsize|filesizeformat }}<br>
-        {% comment %}
-        TODO: 
-        "getconf CLK_TCK" = 100 -> 1 tick = 1/100 seconds
-        see Job.get_stat
-        {% endcomment %}
-        Time spent scheduled in user mode: {{ stats.utime }}00 ms<br>
-        Time spent scheduled in system mode: {{ stats.stime }}00 ms<br>
+        Time spent scheduled in user mode: {{ stats.nice_utime }} s<br>
+        Time spent scheduled in system mode: {{ stats.nice_stime }} s<br>
     {% else %}
         <b>Internal error</b>: process {{ job.pid }} stats are not available.<br>
         Job runner daemon may be restarting now....