博客
关于我
python --- 监控客户端是否存活
阅读量:557 次
发布时间:2019-03-09

本文共 5073 字,大约阅读时间需要 16 分钟。

项目思维与实施

在本项目中主要实现了一个基于SNMP协议的手动监控客户端存活时间的系统。该系统由客户端和服务器端各一个脚本组成,通过SNMP协议完成通信。以下是系统的设计与实现步骤。

项目设计

1. 项目目标

设计并实现一个手动监控客户端存活时间的系统,能够实时追踪每个客户端与服务器之间的通信状态及时间间隔,确保客户端服务的稳定性。

2. 技术选型

  • 协议:选择使用SNMP协议来实现客户端与服务器的通信。
  • 数据持久化:使用pickle模块进行数据的持久化存储,确保数据的安全性和可靠性。
  • 时间计算:使用Python的datetime模块来计算客户端的存活时间间隔。
  • 异常处理:添加异常处理机制,确保系统的健壮性和稳定性。

3. 系统架构

  • 客户端脚本:负责定期向服务器发送存活信息。它们是一个命令行脚本,可以从指定的IP地址和端口发送"up"消息。
  • 服务器端脚本:负责接收来自客户端的存活信息,并在pickle文件中持久化存储这些信息。它还能够根据预定的时间间隔检查客户端的存活状态。
  • 处理脚本:负责检查存储在pickle文件中的客户端的最近连接时间,计算与当前时间的时间差,发现超时的客户端及时发出警告。

实施步骤

1. 客户端脚本

snmpclenit.py

#!/usr/bin/python-- coding:utf-8 --import sockethost, port = '192.168.72.130', 18000s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect((host, port))s.send('up')s.close()
  • script Explain:
    • 使用socket库创建网络连接。
    • 连接到指定的主机和端口。
    • 发送"up"消息。
    • 关闭连接。

2. 服务器端脚本

snmpserver.py

#!/usr/bin/python-- coding:utf-8 --import datetimeimport pickleimport socketfrom socketserver import threading# 定义pickle文件pfile = 'h_dic.pkl'# 打开白名单文件读取IP地址with open('celie.txt') as f:    for line in f:        host = line.strip()        host_status[host] = []class MyMonitorHandler(SocketServer.BaseRequestHandler):    def handle(self):        data = self.request.recv(1024)        if not data:            return                client_ip = self.client_address[0]                # 验证IP是否为本机IP        if client_ip == '192.168.72.130':            # 写入pickle文件            with open(pfile, 'w') as f:                pickle.dump(host_status, f)            print(f"写入文件:{pfile}")        else:            # 检查是否在白名单中            if client_ip in host_status:                # 添加或更新时间                current_time = datetime.datetime.now()                # 检查是否有存在可用的数据                if host_status[client_ip]:                    last_time = host_status[client_ip][-1][0]                    time_diff = (current_time - last_time).seconds                    print(f"From {client_ip}:第(t).{time_diff}秒")                else:                    print(f"From {client_ip}:第一次连接")                # 添加新的记录                host_status[client_ip].append((current_time, data.decode()))                print(f"From {client_ip}:成功接收数据:{data.decode()}")            else:                print(f"抱歉,IP {client_ip} 不在白名单中。")if __name__ == "__main__":    host, port = '192.168.72.130', 18000    # 创建TCPServer并设置多线程处理    server = SocketServer.ThreadingTCPServer((host, port), MyMonitorHandler)    server.serve_forever()
  • script Explain:
    • 使用socketserver创建服务器,监听指定端口。
    • 配置MyMonitorHandler处理收到的数据。
    • 读取白名单中的IP地址,初始化host_status字典。
    • 对于本机IP,负责定期写入pickle文件。
    • 对于其他IP地址,检查是否在白名单中,若在则记录存活时间;否则拒绝接收数据。

3. 处理脚本

m_handle.py

#!/usr/bin/python-- coding:utf-8 --import socketfrom datetime import datetimeimport pickleimport sysdef trigger_dump(host, port):    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    try:        s.connect((host, port))        s.send('up')        s.close()    except Exception as e:        print(f"连接错误:{str(e)}")trigger_dump('192.168.72.130', 18000)# 读取目录下的celie.txt文件并添加到白名单with open('celie.txt') as f:    for line in f:        host = line.strip()        print(f"将{host}添加到白名单中。")# 遍历hibruccbolic.pkl中的存储数据f = file('h_dic.pkl', 'rb')try:    host_status = pickle.load(f)except Exception as e:    print(f"读取haha.pkl文件错误:{str(e)}")    sys.exit(1)# 遍历字典,检测每个客户端的存活时间for h in host_status:    m = host_status[h]    if not m:        print(f"无数据接收:{h}")        continue    old_time = m[-1][0]    current_time = datetime.now()    time_diff = (current_time - old_time).seconds    if time_diff > 30:        print(f"No data received from {h} for {time_diff} seconds, please check!")    else:        print(f"{h}:{time_diff}秒")if __name__ == '__main__':    # 合并client.py脚本    if __name__ == '__main__':        trigger_dump('192.168.72.130', 18000)    # 运行处理脚本    # 需要用户指定目标IP地址    target_ip = sys.argv[1] if len(sys.argv) > 1 else None    if target_ip:        trigger_dump(host=target_ip, port=18000)    # 执行主处理    with file('h_dic.pkl', 'rb') as f:        host_status = pickle.load(f)    for h, m in host_status.items():        if not m:            continue        old_time = m[-1][0]        current_time = datetime.now()        time_diff = (current_time - old_time).seconds        if time_diff > 30:            print(f"No data received from {h} for {time_diff} seconds, please check!")        else:            print(f"{h},{time_diff}秒")
  • script Explain:
    • 使用trigger_dump函数模拟客户端连接服务器发送"up"消息。
    • 读取白名单中的IP地址,初始化字典记录存活状态。
    • 遍历字典,计算每个客户端的存活时间,并检查是否超过预定时间阈值。
    • 提示超时的客户端及时告警。

运行情况

1. 测试客户端

将客户端脚本(snmpclenit.py)在相应的设备上运行:

./snmpclenit.py

确保脚本能够成功连接到服务器并发送"up"消息。

2. 启动服务器端

在服务器端运行服务器脚本(snmpserver.py):

python snmpserver.py 192.168.72.129

注意:IP地址应与celie.txt文件中的IP地址一致。

3. 查看日志与数据

通过tail -f snmpserver.log查看服务器端的日志输出,确保客户端连接成功并被正确记录。

4. 测试处理脚本

运行处理脚本(m_handle.py),指定目标IP地址:

python m_handle.py 192.168.72.129

查看输出结果,确保能够正确计算客户端的存活时间,并识别超时情况。

5. 部署并监控系统

部署上述脚本到相应的环境中,监控系统运行状态。定期检查h_dic.pkl文件的大小和内容,确保数据存储正确。同时监控snmpserver.py进程,确保其正常运行。

注意事项

  • 错误处理:在文件读写和网络连接操作中,需添加综合异常处理,确保系统能够在部分失败的情况下继续运行。
  • 性能优化:对于高负载环境,需优化snmpserver.py中的数据读写和处理逻辑,避免性能瓶颈。
  • 日志记录:增加日志记录功能,便于调试和监控系统运行状态。

通过以上步骤,可以实现一个稳定、可靠的手动监控客户端存活时间的SNMP系统,确保网络设备和服务的稳定运行。

转载地址:http://bwhpz.baihongyu.com/

你可能感兴趣的文章
阿里云轻量云GPU服务器配置
查看>>
深入浅出计算机组成原理目录
查看>>
Vue 知识整理—03-指令2
查看>>
go--microSocket服务端 php客户端
查看>>
go ioutil读写文件
查看>>
如何修改Pspice元件库中元件的模型参数?
查看>>
51单片机汇编程序——查表
查看>>
复杂指针的定义(含复杂函数指针)
查看>>
结构体内存对齐——2
查看>>
从STM32的位带操作重谈嵌入式中寻址与对齐的理解
查看>>
小程序提交新数据后如何返回上一页并刷新数据?
查看>>
qt c++实现的ai贪吃蛇吃满屏幕,超详细!(二)ai的具体实现
查看>>
linux 查看log日志相关命令
查看>>
IDEA 2019 安装 mybatis-plus插件
查看>>
div 实现光标悬停变成手型
查看>>
layer.confirm 无效
查看>>
Java 回调机制
查看>>
7、回归和特征选择
查看>>
测试tensorflow是否安装成功 出现 SyntaxError: invalid syntax的错误
查看>>
pycharm使用(新建工程、字体修改、调试)
查看>>