背景

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

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

实现方法有很多种,最终选择了使用 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. [Vue.js进阶]从源码角度剖析vue-router(三)
  2. Wide ResNet ResNeXt DenseNet DPNet [9] NASNet [10] SENet [11] Capsules [12
  3. ctf -- 内存取证分析工具volatility的下载与安装+简单的使用
  4. boost::filesystem模块实现Windows MAX_PATH的测试程序
  5. scrapy发送翻页请求
  6. ios 自定义拍照页面_vivo X27只靠颜值和拍照吃饭?体验过后你也会被系统所折服...
  7. 表格占据整个页面_excel转换为pdf6个示例,在多个工作表、表格和空白页中进行选择...
  8. Elasticsearch单机安装
  9. 走近深度学习,认识MoXing:初识华为云ModelArts的王牌利器 — MoXing
  10. 剑指offer-06-旋转数组的最小数字
  11. 高中计算机会考教案,高中信息技术会考模拟试题讲课教案.pdf
  12. redis缓存hset, hget, hPutAll
  13. 跨越阶层,至少需要三代人的努力;看千年前的眉山五苏是如何完成的
  14. 基于springboot的停车场管理系统设计与实现
  15. 计嵌 廖峻 20178303040 C++作业
  16. Android——SVG图片转成安卓能用的vector矢量图
  17. 易道云控数字引擎下的企业协同办公
  18. MongoDB相关概念
  19. 反编译class文件
  20. 100道经典Hadoop常见面试/笔试题及答案解析

热门文章

  1. Lesson 3 Please send me a card 请给我寄一张明信片
  2. Matlab GUI编程技巧(八):uitoolbar在图窗中创建工具栏
  3. JQuery Mobile试试水
  4. 笔记:《高效能人士的七个习惯》第九章 习惯六 统合综效——创造性合作的原则
  5. 聊一聊异构系统间数据一致性
  6. MT2014——打靶
  7. IOS开发之——AFN-网络状态监控(04)
  8. Knockout.js----使用计算属性(Computed Observable)
  9. freemarker ftl模板语法和指令
  10. Android WebView字体放大