首页 > 投稿

局域网PING检测,不间断PING,查看局域网、交换机丢包率等

投稿会员昵称: 印修关注投稿量:粉丝量:关注量:   2025-05-17 01:43:02A+A-

1. 环境介绍

开发Python环境 Python 3.9.14 ,具体支持到什么版本未测试!

我运行在 PVE 的 CT 里面,CentOS 9

2. 功能

家里的交换机,不晓得什么问题,有的时候就是丢包,正当来测试吧,又好了。不确定什么时候又有问题了。

还有一些个主机时不时的失联,所以就写了一个小工具,不间断的 ping,然后记录日志文件查看 ping 不通的时间,丢包率等等。

3. 使用代码

进入 ping.py 目录,运行

  1. python3 ping.py


4. 日志输出

  1. 2024-05-10 10:00:00,000 - INFO - 日志文件名: /root/ping/network_monitor_2024-05-10_10-00-00.log
  2. 2024-05-10 10:00:00,000 - INFO - 程序开始运行时间: 2024-05-10 10:00:00
  3. 2024-05-10 10:00:05,000 - WARNING - 主机 10.0.0.1 不可达 - 开始时间: 2024-05-10 10:00:05
  4. 2024-05-10 10:00:10,000 - WARNING - 主机 10.0.0.1 已恢复 - 不可达持续时间: 5.00
  5. 2024-05-10 10:01:00,000 - INFO - 程序结束运行时间: 2024-05-10 10:01:00
  6. 2024-05-10 10:01:00,000 - INFO - 程序总共运行时间: 60.00
  7. 2024-05-10 10:01:00,000 - INFO - 总共 ping 次数: 12
  8. 2024-05-10 10:01:00,000 - INFO - 总共丢包次数: 1
  9. 2024-05-10 10:01:00,000 - INFO - 总丢包率: 8.33%
  10. 2024-05-10 10:01:00,000 - INFO - 平均响应时间: 0.15 毫秒
  11. 2024-05-10 10:01:00,000 - WARNING - 程序异常退出: 收到 SIGINT 信号 (Ctrl+C)

完整 Python 代码:

  1. import subprocess
  2. import time
  3. import re
  4. import logging
  5. import atexit
  6. import signal
  7. import sys
  8. import os
  9.  
  10. print("V2RaySSR 综合网原创")
  11. print("访问 https://www.v2rayssr.com 获取更多资讯和教程")
  12.  
  13. # 定义主机名和日志文件路径为变量
  14. HOST = "10.0.0.1"
  15. LOG_DIR = "/root/ping"
  16.  
  17. # 获取程序开始时间并生成日志文件名
  18. start_time = time.time()
  19. start_time_str = time.strftime('%Y-%m-%d_%H-%M-%S', time.localtime(start_time))
  20. log_filename = os.path.join(LOG_DIR, f'network_monitor_{start_time_str}.log')
  21.  
  22. # 检查目录是否存在,如果不存在则创建
  23. if not os.path.exists(LOG_DIR):
  24.    os.makedirs(LOG_DIR)
  25.  
  26. # 设置日志文件
  27. logging.basicConfig(filename=log_filename, level=logging.INFO,
  28.                    format='%(asctime)s - %(levelname)s - %(message)s')
  29.  
  30. # 测试日志记录功能
  31. try:
  32.    logging.info(f"日志文件名: {log_filename}")
  33. except Exception as e:
  34.    print(f"无法写入日志文件: {e}")
  35.    sys.exit(1)
  36.  
  37. # 初始化统计信息
  38. total_pings = 0
  39. total_lost_pings = 0
  40. total_response_time = 0.0
  41. log_exit_time_called = False  # 标志位,确保 log_exit_time 只被调用一次
  42.  
  43. def ping(host):
  44.    """
  45.    Ping 指定的主机并返回 ping 命令的输出。
  46.    """
  47.    process = subprocess.Popen(['ping', '-c', '1', host], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  48.    stdout, stderr = process.communicate()
  49.    
  50.    if process.returncode == 0:
  51.        return stdout.decode('utf-8')
  52.    else:
  53.        return None
  54.  
  55. def parse_ping_output(output):
  56.    """
  57.    解析 ping 命令的输出,提取丢包率和响应时间。
  58.    """
  59.    loss_match = re.search(r'(\d+)% packet loss', output)
  60.    if loss_match:
  61.        packet_loss = int(loss_match.group(1))
  62.    else:
  63.        packet_loss = 100
  64.    
  65.    time_match = re.search(r'time=(\d+\.\d+) ms', output)
  66.    if time_match:
  67.        ping_time = float(time_match.group(1))
  68.    else:
  69.        ping_time = None
  70.    
  71.    return packet_loss, ping_time
  72.  
  73. def monitor_network(host, interval=5):
  74.    """
  75.    通过定期 ping 指定的主机来持续监控网络。
  76.    """
  77.    global total_pings, total_lost_pings, total_response_time
  78.    last_failure_time = None  # 记录上一次失败的时间
  79.    failure_duration = 0      # 记录持续失败的时间
  80.  
  81.    while True:
  82.        output = ping(host)
  83.        total_pings += 1
  84.        
  85.        if output:
  86.            packet_loss, ping_time = parse_ping_output(output)
  87.            if packet_loss == 100:
  88.                total_lost_pings += 1
  89.                if last_failure_time is None:
  90.                    last_failure_time = time.time()
  91.                    logging.warning(f"主机 {host} 不可达 - 开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_failure_time))}")
  92.                    print(f"主机 {host} 不可达 - 开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_failure_time))}")
  93.                failure_duration = time.time() - last_failure_time
  94.            else:
  95.                total_response_time += ping_time
  96.                if last_failure_time is not None:
  97.                    logging.warning(f"主机 {host} 已恢复 - 不可达持续时间: {failure_duration:.2f} 秒")
  98.                    print(f"主机 {host} 已恢复 - 不可达持续时间: {failure_duration:.2f} 秒")
  99.                    last_failure_time = None
  100.                    failure_duration = 0
  101.        else:
  102.            total_lost_pings += 1
  103.            if last_failure_time is None:
  104.                last_failure_time = time.time()
  105.                logging.error(f"无法 ping 通主机 {host} - 开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_failure_time))}")
  106.                print(f"无法 ping 通主机 {host} - 开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(last_failure_time))}")
  107.            failure_duration = time.time() - last_failure_time
  108.        
  109.        time.sleep(interval)
  110.  
  111. def log_exit_time(exit_reason=None):
  112.    """
  113.    记录程序退出的时间和统计信息。
  114.    """
  115.    global log_exit_time_called
  116.    if log_exit_time_called:
  117.        return
  118.    log_exit_time_called = True
  119.  
  120.    exit_time = time.time()
  121.    exit_time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(exit_time))
  122.    total_run_time = exit_time - start_time
  123.    total_lost_rate = (total_lost_pings / total_pings) * 100 if total_pings > 0 else 0
  124.    avg_response_time = (total_response_time / (total_pings - total_lost_pings)) if (total_pings - total_lost_pings) > 0 else 0
  125.  
  126.    logging.info(f"程序结束运行时间: {exit_time_str}")
  127.    logging.info(f"程序总共运行时间: {total_run_time:.2f} 秒")
  128.    logging.info(f"总共 ping 次数: {total_pings}")
  129.    logging.info(f"总共丢包次数: {total_lost_pings}")
  130.    logging.info(f"总丢包率: {total_lost_rate:.2f}%")
  131.    logging.info(f"平均响应时间: {avg_response_time:.2f} 毫秒")
  132.  
  133.    if exit_reason:
  134.        logging.warning(f"程序异常退出: {exit_reason}")
  135.  
  136.    print(f"程序结束运行时间: {exit_time_str}")
  137.    print(f"程序总共运行时间: {total_run_time:.2f} 秒")
  138.    print(f"总共 ping 次数: {total_pings}")
  139.    print(f"总共丢包次数: {total_lost_pings}")
  140.    print(f"总丢包率: {total_lost_rate:.2f}%")
  141.    print(f"平均响应时间: {avg_response_time:.2f} 毫秒")
  142.  
  143.    # 确保所有日志记录被刷新到磁盘
  144.    logging.shutdown()
  145.  
  146. # 注册程序正常退出时的回调函数
  147. atexit.register(log_exit_time)
  148.  
  149. # 捕捉终止信号(例如 Ctrl+C 和系统重启)
  150. def signal_handler(sig, frame):
  151.    exit_reasons = {
  152.        signal.SIGINT: "收到 SIGINT 信号 (Ctrl+C)",
  153.        signal.SIGTERM: "收到 SIGTERM 信号 (系统关机或重启)",
  154.        signal.SIGHUP: "收到 SIGHUP 信号 (SSH 会话关闭)"
  155.    }
  156.    reason = exit_reasons.get(sig, "收到未知信号")
  157.    log_exit_time(reason)
  158.    sys.exit(0)
  159.  
  160. signal.signal(signal.SIGINT, signal_handler)
  161. signal.signal(signal.SIGTERM, signal_handler)
  162.  
  163. # 捕捉 SIGHUP 信号(SSH 关闭引起的挂起信号)
  164. signal.signal(signal.SIGHUP, signal_handler)
  165.  
  166. if __name__ == "__main__":
  167.    try:
  168.        monitor_network(HOST)
  169.    except Exception as e:
  170.        logging.error(f"程序异常退出: {e}")
  171.        log_exit_time(f"程序异常退出: {e}")
  172.        raise


提示:在享受本文内容的同时,请注意版权归属 徐州鑫坤机电设备有限公司https://www.xzxkjd.com如果您觉得有价值欢迎分享但请务必注明出处,感谢您的理解,谢谢

以下部分内容需要登录查看 立即登录

点击这里复制本文地址 以上内容由用户上传和网络在徐州鑫坤机电设备有限公司整理呈现,如有侵权请联系站长:xzxkjd@qq.com !

1. 本网站可能包含第三方链接,请注意甄别,我们不对其内容负责。

2. 请遵守网络法律法规,在浏览网站时,不传播违法、不良信息,共同维护网络健康。否则后果自负!

3. 本网站内容受版权保护,未经许可,严禁转载!

4. 长时间浏览网站请注意适时休息,保护眼睛,保持身心健康。

5. 在浏览网站过程中,如有任何疑问或需要帮助,请随时联系我们的客服团队。

6. 如有好的内容可投稿申请发布我们收到会第一时间审核发布。

7. 请注意系统即将进行维护可能会影响部分功能的正常使用请提前规划好您的浏览时间,感谢您的理解,享受每一次在线体验

相关内容

加载中~

Copyright ©2012-2024徐州鑫坤机电设备有限公司版权所有
苏ICP备2023032739号-1ICP备2023032739号-2苏ICP备2023032739号-3X
苏公网安备 32038202000884号增值电信业务经营许可证:合字B1-20235517
开发中| 关键词| 网站地图| 网站地图| 网站地图| TAG集合

今日IP人数0今日浏览量(PV)0昨日IP人数0昨日浏览量(PV)07天IP人数07天浏览量(PV)0

网站已运行:

在线客服
服务热线

服务热线

0516-86596070

联系邮箱

服务热线

xzxkjd.@qq.com

微信咨询
我的网站名称
我的网站名称
交流群
返回顶部
X我的网站名称

截屏,微信识别二维码

微信号:xkyinxiu

(点击微信号复制,添加好友)

  打开微信

微信号已复制,请打开微信添加咨询详情!