Files
monitoring/procMon.py
2026-04-27 11:35:05 +02:00

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)