python如何监控某个进程内存的情况
发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,这篇文章主要讲解了"python如何监控某个进程内存的情况",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"python如何监控某个进程内存的情况"吧!p
千家信息网最后更新 2024年11月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安全错误
数据库的锁怎样保障安全
服务器卡顿是因为什么
数据库复杂计算方法
android小软件开发
崇明区市场软件开发服务平均价格
数据库基本概念第6版
28元服务器
网络安全关键技术研究
数据库 加引号
网络安全概论基础公钥英文题
服务器维护多少钱
东莞地产软件开发哪家好
软件开发上市公司市值计算
服务器需要安装vasp吗
武汉软件开发品牌
易泊停车管理端服务器ip
江西奇安信网络安全宣传周
翀堃互联网科技怎么样
2021年3月校园网络安全
数据库表转json字符串
云服务器支持的语言
广州人工智能软件开发价格
青秀区软件开发主要负责人
新电脑输入网络安全密钥
杭州惠普服务器招聘
公安重性精神病数据库
江西时钟监控网管服务器
树莓互联网科技工作室
大连嵌入式软件开发主管
数据库概念模式图
计算机网络安全素质教育考试题库