perprocess cpu usage added
diff --git a/sensors/pscpu_sensors.py b/sensors/pscpu_sensors.py
new file mode 100644
index 0000000..4e1849f
--- /dev/null
+++ b/sensors/pscpu_sensors.py
@@ -0,0 +1,64 @@
+import os
+import time
+
+from discover import provides
+from utils import SensorInfo, get_pid_name, get_pid_list
+
+
+
+@provides("perprocess-cpu")
+def pscpu_stat(disallowed_prefixes=None, allowed_prefixes=None):
+ results = {}
+ pid_stat0 = {}
+ sys_stat0 = {}
+ pid_list = get_pid_list(disallowed_prefixes, allowed_prefixes)
+
+ for pid in pid_list:
+ try:
+ pid_stat0[pid] = pid_stat(pid)
+ sys_stat0[pid] = sys_stat()
+ except IOError:
+ # may be, proc has already terminated
+ continue
+
+ time.sleep(1)
+
+ for pid in pid_list:
+ try:
+ dev_name = get_pid_name(pid)
+
+ pid_stat1 = pid_stat(pid)
+ sys_stat1 = sys_stat()
+ cpu = (pid_stat1 - pid_stat0[pid]) / (sys_stat1 - sys_stat0[pid])
+
+ sensor_name = "{0}.{1}".format(dev_name, pid)
+ results[sensor_name] = SensorInfo(cpu*100, False)
+ except IOError:
+ # may be, proc has already terminated
+ continue
+ return results
+
+
+def pid_stat(pid):
+ """ Return total cpu usage time from process"""
+ # read /proc/pid/stat
+ with open(os.path.join('/proc/', pid, 'stat'), 'r') as pidfile:
+ proctimes = pidfile.readline().split()
+ # get utime from /proc/<pid>/stat, 14 item
+ utime = proctimes[13]
+ # get stime from proc/<pid>/stat, 15 item
+ stime = proctimes[14]
+ # count total process used time
+ proctotal = int(utime) + int(stime)
+ return float(proctotal)
+
+
+def sys_stat():
+ """ Return total system cpu usage time"""
+ with open('/proc/stat', 'r') as procfile:
+ cputimes = procfile.readline().split()[1:]
+ cputotal = 0
+ # count from /proc/stat sum
+ for i in cputimes:
+ cputotal = cputotal + int(i)
+ return float(cputotal)