背景

最近需要监测一个服务器的运行状态。

因为服务器部署在两地,网络抖动对业务的影响很大,所以要在网络抖动情况严重时做一些警报。

实现方法有很多种,最终选择了使用 Python 来实现这样的功能。

实现

Python 实现 ping 有几种方法:

1、自己实现 ping
2、调用系统 ping
3、使用 Python 模块

自己实现 ping

ping 的原理就是发送一份 ICMP 回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。

如果想要自己写,可以自己控制发报文,这里推荐一篇博客大家可以自行前去学习:点我去学习

调用系统 ping

这个就没什么复杂的,就是调用系统的 ping,但是如果有跨平台使用的需求,要区分好系统平台,windows 要特殊处理一下,可以参考如下代码:

import platform    # For getting the operating system name
import subprocess  # For executing a shell commanddef ping(host):"""Returns True if host (str) responds to a ping request.Remember that a host may not respond to a ping (ICMP) request even if the host name is valid."""# Option for the number of packets as a function ofparam = '-n' if platform.system().lower()=='windows' else '-c'# Building the command. Ex: "ping -c 1 google.com"command = ['ping', param, '1', host]return subprocess.call(command) == 0

使用 Python 模块

一般大家也不会自己造轮子,尤其是对于 Python 这种轮子众多的,我们只要从中选择好用的就可以。

这里推荐大家几个挺不错的 ping 模块。

ping3

代码地址:https://github.com/kyan001/ping3

功能很强大,使用简单,缺点也比较明显——需要 root 权限。

Note that ICMP messages can only be sent from processes running as root.
需要 root 权限运行的 process 才能发送 ICMP 数据。

>>> from ping3 import ping, verbose_ping
>>> ping('example.com')  # Returns delay in seconds.
0.215697261510079666>>> verbose_ping('example.com')  # Ping 4 times in a row.
ping 'example.com' ... 215ms
ping 'example.com' ... 216ms
ping 'example.com' ... 219ms
ping 'example.com' ... 217ms

MultiPing

代码地址:https://github.com/romana/multi-ping/

话说一个大牛,觉得目前的工具都不好用,然后就自己写了一个。

特点是可以以较小的资源同时 ping 多个地址。

from multiping import MultiPing# Create a MultiPing object to test three hosts / addresses
mp = MultiPing(["8.8.8.8", "youtube.com", "127.0.0.1"])# Send the pings to those addresses
mp.send()# With a 1 second timout, wait for responses (may return sooner if all
# results are received).
responses, no_responses = mp.receive(1)

TCPing

代码地址:https://github.com/zhengxiaowai/tcping

TCP 实现的 ping,与 ICMP 的 ping 原理不同,但反应网络是否连通、延迟多少的功能是一样的。

还有另外一个优点,也是最终被我选用的优点,不需要 root 权限。

from tcping import Pingdef ping_check():ping = Ping('192.168.0.116', 80, 60)ping.ping(10)ret = ping.result.rowsfor r in ret:print(r)ret = ping.result.rawprint(ret)ret = ping.result.tableprint(ret)if __name__ == '__main__':ping_check()

该有的统计什么的也都是有的,而且很好用。

➜  ~ tcping api.github.com -c 3 --report
Connected to api.github.com[:80]: seq=1 time=237.79 ms
Connected to api.github.com[:80]: seq=2 time=237.72 ms
Connected to api.github.com[:80]: seq=3 time=258.53 ms+----------------+------+-----------+--------+--------------+----------+----------+----------+
|      Host      | Port | Successed | Failed | Success Rate | Minimum  | Maximum  | Average  |
+----------------+------+-----------+--------+--------------+----------+----------+----------+
| api.github.com |  80  |     3     |   0    |   100.00%    | 237.72ms | 258.53ms | 244.68ms |
+----------------+------+-----------+--------+--------------+----------+----------+----------+

行了,就先分享到这里了,大家可以根据自身情况灵活选择,每个库都试一试,总能找到满足你需求的。

祝大家搬砖顺利。

Python 如何 ping相关推荐

  1. python 实现ping测试延迟的两种方法

    一.python实现ping返回延迟繁琐版 __author__ = 'hsz' __date__ = 'Thu Feb 27 22:41:15 EST 2020'import time import ...

  2. python实现ping某一ip_Python实现ping指定IP的示例

    这篇文章主要介绍了关于Python实现ping指定IP的示例,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 贴代码:import os import sys iplist = list ...

  3. python判断ip能否ping通_使用Python测试Ping主机IP和某端口是否开放的实例

    使用Python方法 比用各种命令方便,可以设置超时时间,到底通不通,端口是否开放一眼能看出来. 命令和返回 完整权限,可以ping通,端口开放,结果如下: 无root权限(省略了ping),端口开放 ...

  4. python自动保存ping结果_利用python获取Ping结果示例代码

    前言 本文主要跟大家分享了关于利用python获取Ping结果的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 -*- i ...

  5. Python批量ping脚本

    简单的Python批量ping脚本 ip列表的文件为 192.168.1.1 192.168.1.2 ··· ··· # -*- coding: utf-8 -*- import osdef chec ...

  6. python执行ping并输出,python 执行ping 返回成功与否

    怎样实现在python中ping域名并返回ip 怎样使用python来ping 需求python实时返回ping回包,怎么写 python实现批量ping 如何去写 新建两个文本文件,一个保存为tes ...

  7. Python多线程ping(ping3模块)

    Python多线程ping(ping3模块) 代码 from ping3 import ping from concurrent.futures import ThreadPoolExecutor## ...

  8. python实现ping某一ip_Python:如何ping一系列IP地址?

    我想在Python中ping一系列IP地址并打印: "IP可访问,包丢失率为X%"或 "IP无法访问,包丢失X%" 我想尝试的范围是192.168.0.X,X是 ...

  9. 基于python的ping命令分析与实现

    摘要 在网络日益发达的今天,网络变得越来越重要,而ping命令是我们使用的比较多的用于测试网络连通性的命令,ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就 ...

最新文章

  1. JSF和Struts的区别概述
  2. 创业公司,怎么用人更划算?
  3. 2009年SOA七大预测:SOA借力云计算
  4. python 大量使用json 存储数据时,格式化输出的方式
  5. QString与中文问题
  6. C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章
  7. 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
  8. oracle count over partition by,over (Partition by...) of oracle
  9. 构建幸福婚姻需明白四件事
  10. python根据文件名列表筛选满足条件的文件
  11. Package sqlite3 was not found in the pkg-config search path.add the directory containing `sqlite3.pc
  12. java group by_Java中如何实现对List内容分组(group by)?
  13. springboot整合xxl-job
  14. maven项目spring整合mybatis——最基础的方式
  15. 逻辑回归实战(动手实践)
  16. 乐高JAVA编程_编程和乐高机器人,是一样的吗?学习这些有用吗?
  17. Python编程——数字
  18. 基于微信小程序的健康管理系统-计算机毕业设计
  19. 提升研发质量的三个办法
  20. Java 程序性能优化

热门文章

  1. 移动端自动化测试appium(6)--搭建模拟器和真机环境
  2. 三菱plc恒压供水程序+威纶触摸屏程序 以控制水泵一用一备、一拖二、一拖三、一拖四、一拖四带小泵恒压功能
  3. [9i] 猪年说猪,属相,本命年,十二生肖用英语该怎么说
  4. 【OpenCV在图片上绘制点、圆(C++)】
  5. 计算机显示屏怎么加密,怎样给电脑设置密码的屏幕保护
  6. 嵌入式开发--智能机械臂
  7. 二胎准生证办理流程--很有用。
  8. 主流操作系统的开发语言
  9. 《咏怀古迹五首·其三》.唐.杜甫
  10. 360度全景拍摄,探索全景世界带你飞跃视野新高度