python如何监控某个进程内存的情况
发表于:2025-02-24 作者:千家信息网编辑
千家信息网最后更新 2025年02月24日,这篇文章主要讲解了"python如何监控某个进程内存的情况",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python如何监控某个进程内存的情况"吧!p
千家信息网最后更新 2025年02月24日python如何监控某个进程内存的情况
这篇文章主要讲解了"python如何监控某个进程内存的情况",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python如何监控某个进程内存的情况"吧!
python监控某个进程内存
测试场景:
某个客户端程序长时间运行后存在内存泄漏问题,现在开发解决了需要去验证这个问题是否还存在,并要求出具相应测试验证报告。
手段:
需要有一个工具能够实时去获取该程序进程一直运行下占用内存,CPU使用率情况。
方法:
python去实现这么个监控功能
import sysimport timeimport psutilsys.argv# get pid from args#获取命令行输入的参数个数,sys.ary是一个列表#如果列表参数<2,说明只输入了python 文件名称.py,则退出不继续运行if len(sys.argv) < 2: print ("没有输入要监控的进程编号") sys.exit() #获取进程print("打印进程号:"+sys.argv[1])pid = int(sys.argv[1])p = psutil.Process(pid)#监控进程并将获取CPU,内存使用情况写入csv文件中interval = 60 # 获取CPU,内存使用情况轮询时间间隔num=100with open("process_monitor_" + p.name() + '_' + str(pid) + ".csv", "a+") as f: f.write("时间,cpu使用率(%),内存使用率(%),内存使用值MB\n") # csv文件表头列名:time,cpu使用率,内存使用率,内存占用值MB while num>0: num=num-1 current_time = time.strftime('%Y%m%d-%H%M%S',time.localtime(time.time())) cpu_percent = p.cpu_percent() # better set interval second to calculate like: p.cpu_percent(interval=0.5) mem_percent = p.memory_percent() mem_info=p.memory_info().rss mem_MB=4096 / mem_percent print('当前进程的内存使用:',mem_info) print('当前进程的内存使用:%.4f MB' %mem_MB) line = current_time + ',' + str(cpu_percent) + ',' + str(mem_percent)+','+str(mem_MB) print (line) f.write(line + "\n") time.sleep(interval)
python监控进程并重启
最近公司的游戏服务器经常掉线,老板只能让员工不定时登陆服务器看死掉没有,都快成机器人了,因此python自动化监测进程运用脚本就产生了。
分析了具体思路
1.做个线程定时器,每隔20s执行系统命令查询指定进程名称是否存在
2.如果不存在,就重启;不存在就不进行后续的操作。
相关代码很简单
def restart_process(process_name): red = subprocess.Popen('tasklist', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) tasklist_str = red.stdout.read().decode(encoding='gbk') re_path = process_name.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 = 0error_count = 0timer = 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 [b'success']# 启动web服务器提供api .port=8060httpserver = make_server('', 8060, application)httpserver.serve_forever()'''三个api接口:ip:8060/cpu cpu信息ip:8060/state cpu+memory状态ip:8060/restart_process 重启进程'''
感谢各位的阅读,以上就是"python如何监控某个进程内存的情况"的内容了,经过本文的学习后,相信大家对python如何监控某个进程内存的情况这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
进程
内存
监控
情况
服务
运行
信息
思路
服务器
正在
状态
程序
问题
学习
监测
输入
验证
代码
内容
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
关系型数据库与非关系数据库
武汉百锂网络技术有限公司
中央政法委网络安全教育
csgo5v5在哪个服务器
平度专业软件开发公司电话
网上商店系统的数据库设计
数据库一对多关系如何插入新数据
数据库建表唯一值
服务器文件夹怎么分类
汾阳医院网络安全
数据库接口在哪里查看
网络安全攻防演练的说明
数据库服务器密码忘记了
qq安全网络安全报告
邢台市网商国际软件开发公司
爱思助手服务器备份在哪
兰州网络安全
制作漫画软件手机软件开发
大脸猫网络技术有限公司
烽火网络安全部门
做网络安全品牌的代理
web服务器是基于
软件开发公司如何管理服务器
泾县进口软件开发服务代理品牌
启明 网络安全审计 手册
用id加入服务器安全吗
嵌入式服务器无法启动
网络安全的逻辑安全包括
试用高性能服务器
大脸猫网络技术有限公司