(由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因)

具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自己搭建的http服务器。客户端每k秒钟发送包含CPU利用率、内存使用情况等的心跳包给服务端,由服务端接收和保存分析。(代码在下面)

过程中遇到的问题

1.使用top命令获取系统资源占用情况,获取的结果是带有格式的,

如上图例如数字加粗了,导致得到的结果中带有许多格式信息,使用正则表达式提取数字会得到许多多余的数字。因此改用了vmstat命令。另外,如果不用正则表达式,而是通过切片的方式获取目标数值也是一种方法。

还有一种方法是将print输出后的结果赋值给变量,然后再通过正则表达式匹配数字。赋值方法https://blog.csdn.net/manmanpa/article/details/56479273

(使用vmstat命令发现了另一个问题,第一次得到的id数值永远都很大)

2.不同命令得到的CPU占用率结果不同

3. 最终使用python 的 psutil 库来获取资源占用情况,代替下面客户端代码中的相应部分

class MySend:
def send_info(self):
'''获取当前时间'''
current_time=str(datetime.now()) cpu_usage=psutil.cpu_percent(1) #通过时间间隔1s 获取cpu利用率 memory_usage=psutil.virtual_memory().percent dict_trans={'current_time':current_time,'cpu_use_ratio':cpu_usage,'memory_ratio':memory_usage}
json_trans=json.dumps(dict_trans)
'''传输json串,用requests'''
response=requests.post(url='http:/...',data=json_trans)

客户端

功能:每k秒钟向服务端发送心跳包。实现:python

代码:

import subprocess
import json
import requests
from threading import Timer
from datetime import datetime
import re class MySend:
def send_info(self):
'''获取当前时间'''
current_time=str(datetime.now())
cmd1='vmstat'
ret=subprocess.run(cmd1, shell=True, capture_output=True, encoding='utf-8')
s=ret.stdout
value_ret=re.findall(r"\d+\.?\d*",s)
cpu_use_ratio=100-float(value_ret[-3]) mem_total='grep MemTotal /proc/meminfo'
mem_ret=subprocess.run(mem_total, shell=True, capture_output=True, encoding='utf-8')
total_mem=re.findall(r"\d+\.?\d*",mem_ret.stdout)
total_mem=float(total_mem[0])/1024.0 cmd1='vmstat'
ret=subprocess.run(cmd1, shell=True, capture_output=True, encoding='utf-8')
s=ret.stdout
value_ret=re.findall(r"\d+\.?\d*",s)
memory_ratio=(total_mem-float(value_ret[3])/1024.0)/total_mem*100 dict_trans={'current_time':current_time,'cpu_use_ratio':cpu_use_ratio,'memory_ratio':memory_ratio}
json_trans=json.dumps(dict_trans)
'''传输json串,用requests'''
response=requests.post(url='http:/......../',data=json_trans) class MyTimer():
def __init__(self, start_time, interval, program):
self.__timer=None
self.__start_time=start_time
self.__interval=interval
self.__program=program def exec_program(self):
# print(1)
self.__program()
self.__timer=Timer(self.__interval,self.exec_program) #用于执行等待的时间,要执行的方法
self.__timer.start() def start(self):
#中止时间减去已经进行了多少时间 (现在的时间减去起始的时间)
interval=self.__interval-(datetime.now().timestamp()-self.__start_time.timestamp())
self.__timer=Timer(interval,self.exec_program) #用于执行等待的时间,要执行的方法
self.__timer.start() #开始才能执行上一个语句
def cancel(self):
self.__timer.cancel()
self.__timer=None if __name__=='__main__':
send=MySend()
start=datetime.now()
tmr=MyTimer(start,5,send.send_info) #每五秒钟发送一次
tmr.start()

定时方法参考了https://www.zhiu.cn/54667.html

 服务端:接收并保存分析客户端发来的心跳包。实现:Django

代码:服务端的代码完善后放到github  一个简单的代码

以上为个人学习心得,如有问题请指出

最新文章

  1. 解决:tomcat部署时deploy location不能显示加载后的路径
  2. javascript 值类型与引用类型
  3. CloudStack中云主机的UTC时间转为本地时间
  4. 排序算法(JAVA)
  5. JavaScript学习笔记-商品管理新增/删除/修改功能
  6. codevs3305 水果姐逛水果街Ⅱ
  7. Java开源框架推荐(全)
  8. 在MVC里面使用Response.Redirect方法后记得返回EmptyResult
  9. maven 私服 配置 转
  10. Swift—类的继承-备
  11. IE6/7/8 CSS兼容性问题和解决方法汇总
  12. [置顶] Guava学习之Iterators
  13. [转载] Redis系统性介绍
  14. 洛谷P3209 [HNOI2010]PLANAR
  15. Windows7下使用mingw编译openssl
  16. day07(数据类型的相互转换 ,字符编码)
  17. c++中字符串的反转
  18. Emoji表情代码大全
  19. Linux 进程管理 笔记
  20. Cloud Native Weekly | Kubernetes 1.13发布

热门文章

  1. 学习ASP.NET Core Blazor编程系列十七——文件上传(上)
  2. vivo 云原生容器探索和落地实践
  3. cs231n__4.1 Backpropagation and Neural Network
  4. Redis网络模型究竟有多强
  5. python之路50 ORM执行SQL语句 操作多表查询 双下线方法
  6. 【Java复健指南15】链表LinkedList及其说明
  7. 突如其来的"中断异常",我(Java)该如何处理?
  8. 克拉玛依初赛-wp
  9. 腾讯出品小程序自动化测试框架【Minium】系列(二)项目配置及测试套件使用说明
  10. BUG日记---SSM进行多表查询错误-----页面使用<c:foreach>错误