summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2008-12-08 13:08:42 -0200
committerArnaldo Carvalho de Melo <acme@redhat.com>2008-12-08 13:08:42 -0200
commite3c84670cea0d9d8179f20ef9789c87428547a32 (patch)
tree833db52248f9cd477956763d1918057e77e29228
parent74ffa3a3f3e547cd247fd5fe2b00d96ea7c0499e (diff)
downloadpython-linux-procfs-e3c84670cea0d9d8179f20ef9789c87428547a32.tar.gz
pidstats: Add process class to catch dict references for late parsing
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rwxr-xr-xprocfs/procfs.py77
1 files changed, 44 insertions, 33 deletions
diff --git a/procfs/procfs.py b/procfs/procfs.py
index 627c9dd..9c0ccac 100755
--- a/procfs/procfs.py
+++ b/procfs/procfs.py
@@ -120,13 +120,53 @@ class pidstatus:
self.fields = {}
for line in f.readlines():
fields = line.split(":")
+ if len(fields) != 2:
+ continue
name = fields[0]
value = fields[1].strip()
try:
- self.fields[fields[0]] = int(value)
+ self.fields[name] = int(value)
except:
- self.fields[fields[0]] = value
+ self.fields[name] = value
+ f.close()
+
+class process:
+
+ def __init__(self, pid, basedir = "/proc"):
+ self.pid = pid
+ self.basedir = basedir
+
+ def __getitem__(self, attr):
+ if not hasattr(self, attr):
+ if attr in ("stat", "status"):
+ if attr == "stat":
+ sclass = pidstat
+ else:
+ sclass = pidstatus
+
+ setattr(self, attr, sclass(self.pid, self.basedir))
+ elif attr == "cmdline":
+ self.load_cmdline()
+ elif attr == "threads":
+ self.load_threads()
+
+ return getattr(self, attr)
+
+ def has_key(self, attr):
+ return hasattr(self, attr)
+
+ def load_cmdline(self):
+ f = file("/proc/%d/cmdline" % self.pid)
+ line = f.readline()
f.close()
+ if line:
+ self.cmdline = line.strip().split('\0')
+ print "pid: %d, cmdline=(%s)" % (self.pid, self.cmdline)
+
+ def load_threads(self):
+ self.threads = pidstats("/proc/%d/task/" % self.pid)
+ # remove thread leader
+ del self.threads[self.pid]
class pidstats:
@@ -161,45 +201,16 @@ class pidstats:
except:
continue
- self.processes[pid] = {}
- try:
- self.processes[pid]["stat"] = pidstat(pid, self.basedir)
- except:
- del self.processes[pid]
- continue
-
- try:
- self.processes[pid]["status"] = pidstatus(pid, self.basedir)
- except:
- del self.processes[pid]
+ self.processes[pid] = process(pid, self.basedir)
def reload_threads(self):
for pid in self.processes.keys():
try:
- threads = pidstats("/proc/%d/task/" % pid)
- # remove thread leader
- del threads[pid]
- if not threads.keys():
- continue
- self.processes[pid]["threads"] = threads
+ self.processes[pid].load_threads()
except OSError:
# process vanished, remove it
del self.processes[pid]
- def load_cmdline(self):
- for pid in self.processes.keys():
- if self.processes[pid].has_key("cmdline"):
- continue
- try:
- f = file("/proc/%d/cmdline" % pid)
- line = f.readline()
- if line:
- self.processes[pid]["cmdline"] = line.strip().split('\0')
- f.close()
- except IOError:
- # process vanished, remove it
- del self.processes[pid]
-
def find_by_name(self, name):
name = name[:15]
pids = []