为 ping 添加时间戳后台运行实时输出保存日志 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wsgzao
V2EX    Linux

为 ping 添加时间戳后台运行实时输出保存日志

  •  
  •   wsgzao
    wsgzao 2021-06-09 16:15:13 +08:00 2389 次点击
    这是一个创建于 1668 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    ping 命令是一种比较好用的网络诊断工具,常用来验证链路问题,例如 ping traceroute mtr 都使用的 “ICMP” 包来测试 Internet 两点之间的网络连接状况。生产环境中, 网络是否稳定(网络时延)是一个很重要的指标. 为了方便检查网络时延的大小, 我们可以通过 ping 命令实现长时间的网络监控。

    本文主要记录了 Linux 环境如何使用 ping 命令+时间戳实时输出保存到文件里面的解决方案

    更新历史

    2021 年 06 月 06 日 - 初稿

    阅读原文 - https://wsgzao.github.io/post/ping/


    ping 简介

    ping 大家可能每天都在使用,不多做介绍了

    ping ()是一种计算机网络工具,用来测试数据包能否透过 IP 协议到达特定主机。ping 的运作原理是向目标主机传出一个 ICMP 的请求回显数据包,并等待接收回显回应数据包。程序会按时间和成功响应的次数估算丢失数据包率(丢包率)和数据包往返时间(网络时延,Round-trip delay time )。

    直接ping ip即可。

    若显示ping的回显时间,此命令也提供了参数 -D来回显时间戳。

    # ping baidu.com -D PING baidu.com (39.156.69.79) 56(84) bytes of data. [1623205720.047547] 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=23 time=274 ms [1623205720.321747] 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=23 time=274 ms [1623205721.322361] 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=23 time=274 ms [1623205722.323220] 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=4 ttl=23 time=274 ms [1623205723.324359] 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=5 ttl=23 time=274 ms 

    然而,时间戳可读性较差,虽然可以利用网上的一些工具(unitxtime)来转化,但是比较麻烦,最好的方式时回显时就是可读性较好的时间格式。

    ping 命令的使用

    常用参数

    -i: 每次执行 ping 操作的间隔时间, 默认是 1s;

    -c: 执行 ping 操作的次数, 默认是一直执行, 除非被中断;

    -s: 指定执行 ping 操作时发送的包的大小, 默认是 56B, 添加报文头之后, 最终发送的是 64B.

    # 在终端 ping 某个地址, 执行 10 次 ping baidu.com -c 10 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) } ' 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=40 time=83.3 ms 10:41:23 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=40 time=83.4 ms 10:41:24 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=40 time=83.4 ms 10:41:25 # 日期在后面 ping baidu.com | awk '{ print $0"\t" strftime("%Y-%m-%d %H:%M:%S",systime()); fflush()}' 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=40 time=83.2 ms 2021-06-09 10:42:45 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=40 time=83.3 ms 2021-06-09 10:42:46 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=40 time=83.3 ms 2021-06-09 10:42:47 # 日前在前面 ping baidu.com | awk '{ print strftime("%Y.%m.%d %H:%M:%S",systime())"\t" $0; fflush() }' 2021.06.09 10:43:28 64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=46 time=162 ms 2021.06.09 10:43:29 64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=46 time=177 ms 2021.06.09 10:43:30 64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=46 time=174 ms 

    ping 将输出重定向到指定文件

    使用 fflush

    注意:使用 fflush(),不然文件不会有信息,因为 awk 也是有缓存的。

    为防止脚本被中断, 可以通过 nohup 令脚本在后台执行:

    # 下面未加 fflush(),执行命令生成文件会等一会才会有信息打印到文件里 nohup ping baidu.com | awk '{ print strftime("%Y-%m-%d %H:%M:%S",systime())"\t" $0; fflush() }' >> long_ping.txt & $ tail -f long_ping.txt 2021-06-09 10:45:54 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=40 time=83.3 ms 2021-06-09 10:45:55 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=40 time=83.3 ms 2021-06-09 10:45:56 64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=4 ttl=40 time=83.3 ms # 要结束后台进程, 可通过下述方式查找并 kill $ ps -ef |grep ping user00 5778 30382 0 10:45 pts/2 00:00:00 ping baidu.com user00 7133 30382 0 10:48 pts/2 00:00:00 grep --color=auto ping $ kill -9 5778 [1]+ Done nohup ping baidu.com | awk '{ print strftime("%Y.%m.%d %H:%M:%S",systime())"\t" $0; fflush() }' >> long_ping.txt 

    使用 pong

    1. 什么是 pingpong?

    pingpong 是一种数据缓存的手段,通过 pingpong 操作可以提高数据传输的效率。

    1. 什么时候需要 pingpong ?

    在两个模块间交换数据时,上一级处理的结果不能马上被下一级所处理完成,这样上一级必须等待下一级处理完成才可以送新的数据,这样就会对性能产生很大的损失。

    引入 pingpong 后我们可以不去等待下一级处理结束,而是将结果保存在 pong 路的缓存中,pong 路的数据准备好的时刻,ping 路的数据也处理完毕(下一级),然后无需等待直接处理 pong 路数据,上一级也无需等待,转而将结果存储在 ping 路。这样便提高了处理效率。

    nohup ping baidu.com -i 1 | while read pong; do echo "$(date +"%Y-%m-%d %H:%M:%S") | $pong"; done | tee -a ping-baidu.com.log & 
    3 条回复    2021-06-19 11:11:11 +08:00
    ruanimal
        1
    ruanimal  
       2021-06-09 16:53:10 +08:00   1
    ping 127.0.0.1 -c 5 | ts '[%Y-%m-%d %H:%M:%S]'
    yanqiyu
        2
    yanqiyu  
       2021-06-14 11:59:55 +08:00   1
    systemd-run --user ping
    ping 的输出会带着时间等等信息被存到 journal,然用 journalctl 输出 json 格式再处理或者直接输出带时间的文本保存就行。
    5up3r
        3
    5up3r  
       2021-06-19 11:11:11 +08:00
    ping baidu.com | while read line; do echo -e "$(date +"%Y-%m-%d %T") $line"; done
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2265 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 15:47 PVG 23:47 LAX 07:47 JFK 10:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86