129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
import promMon as pm
|
|
import os
|
|
import subprocess
|
|
from time import sleep
|
|
|
|
result = subprocess.run(['getconf', 'CLK_TCK'], stdout=subprocess.PIPE)
|
|
result = result.stdout.decode('utf-8')
|
|
|
|
tikspersec = int(result)
|
|
|
|
def getPIDs():
|
|
pids = []
|
|
for i in os.listdir("/proc"):
|
|
if i.isdigit():
|
|
pids.append(i)
|
|
|
|
return pids
|
|
|
|
def parseStatus(pid):
|
|
with open("/proc/"+str(pid)+"/status", "r") as f:
|
|
status = f.read().replace("\t","").split("\n")
|
|
status.pop(-1)
|
|
status_dict = {}
|
|
for item in status:
|
|
i = item.split(":")
|
|
try:
|
|
k = i[1].split(" ")
|
|
data = []
|
|
for j in k:
|
|
if j != "":
|
|
data.append(j)
|
|
status_dict[i[0]] = data[0]+" "+data[1]
|
|
except Exception as e:
|
|
pass
|
|
|
|
return status_dict
|
|
|
|
def parseMeminfo():
|
|
with open("/proc/meminfo", "r") as f:
|
|
meminfo = f.read().split("\n")
|
|
meminfo_dict = {}
|
|
for i in meminfo:
|
|
i = i.split(" ")
|
|
vals = []
|
|
for j in i:
|
|
if j != "":
|
|
vals.append(j.replace(":",""))
|
|
try:
|
|
meminfo_dict[vals[0]] = int(vals[1]) * byteMult(vals[2])
|
|
except:
|
|
pass
|
|
return meminfo_dict
|
|
|
|
def byteMult(value):
|
|
if value == "B":
|
|
return 1
|
|
elif value == "kB":
|
|
return 1000
|
|
elif value == "MB":
|
|
return 1000000
|
|
elif value == "GB":
|
|
return 1000000000
|
|
elif value == "TB":
|
|
return 1000000000000
|
|
|
|
def exportProcesses(last_proc_stat=0):
|
|
pids = getPIDs()
|
|
processes = {}
|
|
|
|
with open("/proc/uptime", "r") as f:
|
|
uptime = float(f.read().split(" ")[0])
|
|
|
|
for pid in pids:
|
|
try:
|
|
with open("/proc/"+pid+"/stat", "r") as f:
|
|
stat = f.read().replace("(", "").split(") ")
|
|
stat[1] = stat[1].replace('\n', "")
|
|
s0 = stat[0].split(" ", 1)
|
|
s1 = stat[1].split(" ")
|
|
stat = s0 + s1
|
|
|
|
processes[pid] = {}
|
|
processes[pid]["id"] = stat[0]
|
|
processes[pid]["comm"] = stat[1]
|
|
processes[pid]["virt"] = stat[22]
|
|
processes[pid]["cpu_tiks_user"] = int(stat[13])
|
|
processes[pid]["cpu_tiks_system"] = int(stat[14])
|
|
processes[pid]["cpu_secs"] = (int(stat[13]) + int(stat[14])) / tikspersec
|
|
processes[pid]["page_fault_major"] = stat[11]
|
|
processes[pid]["page_fault_minor"] = stat[9]
|
|
processes[pid]["starttime"] = int(stat[21]) / tikspersec
|
|
processes[pid]["threadcnt"] = stat[19]
|
|
processes[pid]["state"] = stat[2]
|
|
processes[pid]["parent_pid"] = stat[3]
|
|
processes[pid]["runtime_seconds"] = uptime - processes[pid]["starttime"]
|
|
processes[pid]["cpu_total"] = 100 * processes[pid]["cpu_secs"] / processes[pid]["runtime_seconds"]
|
|
processes[pid]["cpu"] = 0
|
|
|
|
if last_proc_stat != 0:
|
|
try:
|
|
cpu_secs = processes[pid]["cpu_secs"] - last_proc_stat[pid]["cpu_secs"]
|
|
sampletime = processes[pid]["runtime_seconds"] - last_proc_stat[pid]["runtime_seconds"]
|
|
processes[pid]["cpu"] = 100 * cpu_secs / sampletime
|
|
except:
|
|
pass
|
|
|
|
status = parseStatus(pid)
|
|
meminfo = parseMeminfo()
|
|
memory = status["VmData"].split(" ")
|
|
if memory[0] == "":
|
|
memory.pop(0)
|
|
processes[pid]["memory"] = int(memory[0]) * byteMult(memory[1])
|
|
processes[pid]["memory_percent"] = 100 * (int(memory[0]) * byteMult(memory[1])) / meminfo["MemTotal"]
|
|
except Exception as e:
|
|
# print(e)
|
|
pass
|
|
|
|
return processes
|
|
|
|
|
|
if __name__ == "__main__":
|
|
proc = exportProcesses()
|
|
for i in range(0,10):
|
|
proc = exportProcesses(proc)
|
|
for pid in proc:
|
|
print(proc[pid])
|
|
sleep(2)
|
|
|