今天,我的网络环境很差,如下:

但是普通的ping命令:
1.看不到时间戳信息的
2.我看不到ping反映出的网络状况波动到底多大

如果只是希望多一个看时间戳信息的维度,可以直接用PowerShell实现。

不过在这里,我还是写了一个Python脚本来解决我上面的两个疑问。
我的Python的运行效果如下:
在命令行中,你可以清晰的看到什么时间,ping的状态如何:

并且,你可以看到脚本运行以来,ping命令返回的时间信息的趋势:

有时候,你跑ping命令,可能只希望查看最近10秒、20分钟、30分钟的ping表现,但是你又不想数着时钟守在电脑旁边。
那么你可以在脚本中设置运行时长:

————————
脚本的运行表现如上所示。

脚本的源码如下,你可以下载到自己的环境里玩玩:

Python:3.x

# -*- coding:utf8 -*-

# import
import os

import re

import datetime
import time

import matplotlib.pyplot as plt

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

import numpy as np

# variable

# 该脚本运行多久(秒)
time_left = 300
ping_data_collection = ""

# Y轴最大值
y_max_size = 3000

# 当前时间
time_current = str(datetime.datetime.now()).split('.')[0]
num_time_current = time.mktime(time.strptime(time_current, "%Y-%m-%d %H:%M:%S"))

time_stop = (datetime.datetime.now()+datetime.timedelta(seconds=time_left)).strftime("%Y-%m-%d %H:%M:%S")
num_time_stop = time.mktime(time.strptime(time_stop, "%Y-%m-%d %H:%M:%S"))

# function

# 一次PING的执行
def ping_one_time(target_url,if_lost):

    # variable
    line_echo_callback = ""
    line_echo_callback_package_byte = ""
    line_echo_callback_package_TimeCost_full_string = ""
    line_echo_callback_package_TimeCost_Number_part = ""

    # do

    exec_result = os.popen("ping -n 1 "+target_url).read()

    print(exec_result.split('\n'))

    if "不" in exec_result.split('\n')[0] or "请求超时" in exec_result.split('\n')[2]:

        # do
        line_echo_callback_package_TimeCost_Number_part = str(if_lost)

        # display
        print("网络丢包")

        # default: pass
        pass

    else:

        line_echo_callback = str(exec_result).split('\n')[2]

        line_echo_callback_package_byte = line_echo_callback.split(' ')[3].split('=')[1]
        line_echo_callback_package_TimeCost_full_string = line_echo_callback.split(' ')[4].split('=')[1]
        line_echo_callback_package_TimeCost_Number_part = ''.join(re.findall('\d',line_echo_callback_package_TimeCost_full_string))

    datetime_current = str(datetime.datetime.now())

    # display

    # print(exec_result)
    print("==============")
    print("Current Time【" + datetime_current + "】 --> 【" + line_echo_callback + "】")
    print("Package Byte is【"+line_echo_callback_package_byte+"】 with Time Cost is【"+line_echo_callback_package_TimeCost_Number_part+"】")

    # 通过上面的两个数值绘图
    # 1. 时间
    # 2. 每次收包时间(ms)
    # 3. 如果收不到,则标红

    return_data = "\"" + datetime_current + "\":" + line_echo_callback_package_TimeCost_Number_part

    # return
    return return_data

    # default: pass
    pass

# 使用Matplotlib,绘制图形
def staff_matplotlib_display_data(source_data_string,ylim_max_size):

    source_data = eval(source_data_string)

    #for a, b in source_data.items():
    #    plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom',fontsize=9)  # ha 文字指定在柱体中间, va指定文字位置 fontsize指定文字体大小

    # 设置X轴Y轴数据,两者都可以是list或者tuple
    x_axis = tuple(source_data.keys())
    y_axis = tuple(source_data.values())
    plt.bar(x_axis, y_axis, color='rgb')  # 如果不指定color,所有的柱体都会是一个颜色

    x = np.arange(len(x_axis)+1)
    plt.xticks(x,x_axis,rotation=270)
    plt.xlabel(u"时间")  # 指定x轴描述信息
    plt.ylabel(u"网络延迟(ms)")  # 指定y轴描述信息
    plt.title("【ping】状态统计表")  # 指定图表描述信息
    plt.ylim(0, ylim_max_size)  # 指定Y轴的高度
    plt.savefig('Ping_Overview_{}.png'.format(time.strftime('%Y%m%d%H%M%S')))  # 保存为图片
    plt.show()

    # default: pass
    pass

# do: main

if __name__ == "__main__":

    # do

    #ping_one_time(target_url="baidu.com")

    #while True:
    #    ping_one_time(target_url="baidu.com")

    #staff_matplotlib_display_data()

    # display
    print("当前时间:【"+time_current+"】"+str(num_time_current))
    #print("【" + str(datetime.datetime.strptime(time_current, "%Y-%m-%d %H:%M:%S")) + "】")
    #print(time.mktime(time.strptime(time_current, "%Y-%m-%d %H:%M:%S")))
    print("目标时间:【"+time_stop+"】"+str(num_time_stop))
    #print("【"+str(datetime.datetime.strptime(time_stop, "%Y-%m-%d %H:%M:%S"))+"】")
    #print(time.mktime(time.strptime(time_stop, "%Y-%m-%d %H:%M:%S")))

    # do
    while num_time_current < = num_time_stop:

        print("#########################")
        print("Current【@】"+time_current)
        print("Stop Time is【"+time_stop+"】")
        print("----")
        current_ping_result = ping_one_time(target_url="d-prototype.com",if_lost=y_max_size)
        print("")

        if ping_data_collection == "":
            ping_data_collection = "{"+current_ping_result
        else:
            ping_data_collection += "," + current_ping_result

        # 重置变量
        #time_current = str(datetime.datetime.now())
        time_current = (datetime.datetime.now()+datetime.timedelta(seconds=1)).strftime("%Y-%m-%d %H:%M:%S")
        num_time_current = time.mktime(time.strptime(time_current, "%Y-%m-%d %H:%M:%S"))

    # 补全变量
    ping_data_collection += "}"

    # display
    print("0000000000000000000000000000000000")
    print(ping_data_collection)

    # Matplotlib
    staff_matplotlib_display_data(ping_data_collection,ylim_max_size=y_max_size)

    # default: pass
    pass

# finished

————————————————
Done。

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒