对服务器进行心跳检测 python django
2024-10-21 13:35:09
(由于春节期间连不上服务器,但又不知道是不是服务器关机了,因此写一个心跳检测功能遇到问题时可以排查部分原因)
具体来说分为客户端和服务端,客户端为校园服务器,服务端为我们自己搭建的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 一个简单的代码
以上为个人学习心得,如有问题请指出
最新文章
- 解决:tomcat部署时deploy location不能显示加载后的路径
- javascript 值类型与引用类型
- CloudStack中云主机的UTC时间转为本地时间
- 排序算法(JAVA)
- JavaScript学习笔记-商品管理新增/删除/修改功能
- codevs3305 水果姐逛水果街Ⅱ
- Java开源框架推荐(全)
- 在MVC里面使用Response.Redirect方法后记得返回EmptyResult
- maven 私服 配置 转
- Swift—类的继承-备
- IE6/7/8 CSS兼容性问题和解决方法汇总
- [置顶] Guava学习之Iterators
- [转载] Redis系统性介绍
- 洛谷P3209 [HNOI2010]PLANAR
- Windows7下使用mingw编译openssl
- day07(数据类型的相互转换 ,字符编码)
- c++中字符串的反转
- Emoji表情代码大全
- Linux 进程管理 笔记
- Cloud Native Weekly | Kubernetes 1.13发布
热门文章
- 学习ASP.NET Core Blazor编程系列十七——文件上传(上)
- vivo 云原生容器探索和落地实践
- cs231n__4.1 Backpropagation and Neural Network
- Redis网络模型究竟有多强
- python之路50 ORM执行SQL语句 操作多表查询 双下线方法
- 【Java复健指南15】链表LinkedList及其说明
- 突如其来的&;amp;quot;中断异常&;amp;quot;,我(Java)该如何处理?
- 克拉玛依初赛-wp
- 腾讯出品小程序自动化测试框架【Minium】系列(二)项目配置及测试套件使用说明
- BUG日记---SSM进行多表查询错误-----页面使用<;c:foreach>;错误