python读取进程内存数据,python查看程序内存占用

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: