对服务器进行心跳检测 python django
(由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因)
具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自己搭建的http服务器。客户端每k秒钟发送包含CPU利用率、内存使用情况等的心跳包给服务端,由服务端接收和保存分析。(代码在下面)
过程中遇到的问题
后续:vue naive ui 前端 前后端交互 跨域等问题
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 一个简单的代码
以上为个人学习心得,如有问题请指出