python读取进程内存数据,python查看程序内存占用
本文主要介绍了python监控某个进程内存的情况,有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。
目录
python监控进程的内存。python监控进程并重启,分析具体思路。相关代码非常简单。
python监控某个进程内存
测试场景:
一个客户端程序运行很长时间后出现内存泄漏问题。现在需要验证这个问题是否还存在,需要相应的测试验证报告。手段:
需要有一个工具可以实时得到这个程序进程占用的内存和CPU利用率。方法:
Python实现了这样一个监控函数导入sys
导入时间
导入psutil
sys.argv
#从参数中获取pid
#获取在命令行中输入的参数个数,sys.ary是一个列表
#如果list参数2表明只有python文件名。已经输入py,不继续退出。
if len(sys.argv) 2:
打印(“没有输入要监控的过程编号”)
sys.exit()
#获取流程
Print(打印进程号3360 sys.argv [1])
pid=int(sys.argv[1])
p=psutil。过程(管道仪表流程图)
#监控进程并将CPU和内存使用情况写入csv文件。
Interval=60 #获取CPU和内存使用的轮询间隔
数量=100
with open( process _ monitor _ p . name() _ str(PID)。csv , a )作为f:
F.write (time,cpu使用率(%),内存使用率(%),内存使用率值MB\n) # csv文件头列名:time,cpu使用率,内存使用率,内存使用率值MB
而num0:
数字=数字-1
current _ time=time . strftime( % Y % M % d-% H % M % S ,time.localtime(time.time()))
cpu_percent=p.cpu_percent() #最好设置间隔秒,以便像: p.cpu_percent(间隔=0.5)那样计算
内存百分比=p .内存百分比()
mem_info=p.memory_info()。简易资讯聚合
内存_MB=4096 /内存_百分比
Print(当前进程的内存使用:,mem_info)
Print(当前进程的内存使用量:% . 4f MB“% mem _ MB”)
line=current_time , str(cpu_percent), str(mem_percent), str(mem_MB)
打印(行)
f.write(行 \n )
时间.睡眠(间隔)
python监控进程并重启
最近公司的游戏服务器经常断网,老板只能时不时让员工登录服务器看看是不是死了,几乎就是机器人。因此,python自动监控过程使用脚本来产生。
分析了具体思路
1.制作一个线程定时器,每20秒执行一次系统命令,查询指定的进程名是否存在。
2.如果不存在,重新启动;如果不存在,则不进行后续操作。
相关代码很简单
定义重启进程(进程名):
红色=子流程。Popen(tasklist ,stdout=子进程。管道,stderr=子进程。管道,壳=真)
tasklist_str=red.stdout.read()。解码(编码=gbk )
re_path=进程名. split
("\\")[-1]
formattime = datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)
if re_path not in tasklist_str:
# obj = connect_emai()
# sendmail(程序卡掉正在重启。。。, obj)
# 发送HTTP请求
# url = "http://159.138.131.148/server_offline.html"
# request = urllib.request(url)
global count
count += 1
print(formattime + 第 + str(count) + 次检测发现异常重连)
cmd = process_name
os.system(process_name)
# res = subprocess.Popen(cmd,stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)
# print(res.stderr.read().decode(encoding=gbk),res.stdout.read().decode(encoding=gbk))
# sendmail(重启连接成功!,obj)
print(yes,connected)
else:
global error_count
error_count += 1
print(formattime + 第 + str(error_count) + 次检测正在运行中)
global timer
timer = Timer(20, restart_process, ("start C:\Progra~1\CloudControlServer\CloudControlServer.exe",))
timer.start()
count = 0
error_count = 0
timer = Timer(20, restart_process, ("start C:\Progra~1\CloudControlServer\CloudControlServer.exe",))
timer.start()
搞定!!!
接下来有了新的需求~~ 需要监控CPU的运行状态,如果CPU一直维持在80%以上 就主动杀死进程,并重启进程,使用了牛逼的psutil 跨系统平台操作库。实现代码如下:
def look_cpu(process_name):res = subprocess.Popen(wmic cpu get LoadPercentage, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
res_str = res.stdout.read().decode(encoding=gbk)
num = re.findall(\d+, res_str)[0]
if int(num) > 80:
print(cup负载超过10%)
time.sleep(10)
res_twice = subprocess.Popen(wmic cpu get LoadPercentage, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True)
res_twice_str = res_twice.stdout.read().decode(encoding=gbk)
num_twice = re.findall(\d+, res_twice_str)[0]
# 判断两次监测稳定在5%以内 杀死进程并重启
if abs(int(num) - int(num_twice)) < 5:
tasklist = subprocess.Popen(tasklist findstr CloudControlServer.exe, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
res = tasklist.stdout.read().decode(encoding=gbk)
pid = re.search(\d{1,4}, res).group()
cmd = taskkill -f /pid %s % pid
time.sleep(0.5)
print(cmd)
os.system(taskkill -f /pid %s % pid)
os.system(process_name)
print(正在监测cpu,cpu占用率:%s % num)
global timer
timer = Timer(30, look_cpu, ("start C:\Progra~1\CloudControlServer\CloudControlServer.exe",))
timer.start()
但是第三天老板有了新的需求,需要做个web端 将CPU和内存信息开放api 并且支持远程重启,我的思路是利用python自带的http服务类库,省去了socket编程的麻烦,直接输入IP port 即可,这里使用了wsgiref.simple_server
# web服务应用函数def application(environ, start_response):
path = environ.get(PATH_INFO)
start_response(200 OK, [])
# 提供cpu 状态信息
if path == /cpu:
res = subprocess.Popen(wmic cpu get LoadPercentage, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True)
res_str = res.stdout.read().decode(encoding=gbk)
resp = {cpu: re.findall(\d+, res_str)[0]}
return [json.dumps(resp).encode(encoding=utf-8)]
# 提供cpu + memory 信息
elif path == /state:
cpu = psutil.cpu_percent()
memory = psutil.virtual_memory()
memory_lv = float(memory.used) / float(memory.total) * 100
res = {cpu: cpu, memory: memory_lv}
return [json.dumps(res).encode(encoding=utf-8)]
# 提供重启进程api
elif path == /restart_process:
# os.system(shutdowm.exe -r)
res = remote_restart_process("start C:\Progra~1\CloudControlServer\CloudControlServer.exe")
return [bsuccess]
# 启动web服务器提供api .port=8060
httpserver = make_server(, 8060, application)
httpserver.serve_forever()
三个api接口:
ip:8060/cpu cpu信息
ip:8060/state cpu+memory状态
ip:8060/restart_process 重启进程
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。