给ping添加时间戳在后台运行实时输出并保存日志各点之间的网络连通性。在生产环境中,网络是否稳定(网络延迟)是一个很重要的指标。为了方便的查看网络延迟的大小,我们可以使用ping命令来实现长时间的网络监控。本文主要记录如何在Linux环境下使用ping命令+时间戳输出实时输出并保存到文件中。简介您可能每天都在使用ping。我就不多介绍了。Ping(呯)是一种计算机网络工具,用于测试数据包能否通过IP协议到达特定主机。ping的工作原理是向目标主机发送一个ICMP请求回显包,等待回显响应包被接收。程序根据时间和成功响应的次数来估算丢包率(packetlossrate)和数据包往返时间(networkdelay,Round-tripdelaytime)。直接pingip就可以了。为了显示ping的回显时间,该命令还提供参数-D来回显时间戳。#pingbaidu.com-DPINGbaidu.com(39.156.69.79)56(84)bytesofdata.[1623205720.047547]64bytesfrom39.156.69.79(39.156.69.79):icmp_seq=1ttl=23time=274ms[1742732]]来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=2ttl=23time=274ms[1623205721.322361]来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=3ttl=23mstime=2724]来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=4ttl=23time=274ms时间戳的可读性较差。虽然可以使用一些在线工具(unitxtime)进行转换,但比较麻烦。最好的方法是以更易读的时间格式回应它们。ping命令的常用参数-i:每次执行ping操作的时间间隔,默认为1s;-c:执行ping操作的次数,默认一直执行,除非被中断;包的大小,默认是56B,加上header后,最终发送的是64B。#在终端ping某个地址,执行pingbaidu.com10次-c10|awk'{print$0"\t"strftime("%H:%M:%S",systime())}'来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=1ttl=40time=83.3ms来自39.156.69.79(39.156.69.79)的10:41:2364字节:icmp_seq=2ttl=40时间=83.4毫秒10:41:2464字节来自39.156.69.79(39.156.69.79):icmp_seq=3ttl=40时间=83.4ms10:41:25#日期在后面pingbaidu.com|awk'{print$0"\t"strftime("%Y-%m-%d%H:%M:%S",systime());fflush()}'来自39.156的64个字节。69.79(39.156.69.79):icmp_seq=1ttl=40time=83.2ms2021-06-0910:42:4564来自39.156.69.79(39.156.69.79)的字节:icmp_seq=2ttl=40time=83.3ms2021-06-0910:42:4664bytesfrom39.156.69.79(39.156.69.79):icmp_seq=3ttl=40time=83.3ms2021-06-0910:42:47#pingbaidu.com前面几天之前|awk'{printstrftime("%Y.%m.%d%H:%M:%S",systime())"\t"$0;fflush()}'2021.06.0910:43:28来自220.181.38.148(220.181.38.148)的64个字节:icmp_seq=1ttl=46time=162ms2021.06.0910:43:29来自220.1481.3(220.181)的64个字节.38.148):icmp_seq=2ttl=46time=177ms2021.06.0910:43:3064bytesfrom220.181.38.148(220.181.38.148):icmp_seq=3ttl=46time=174mspingredirectoutputto指定文件到使用fflush注意:使用fflush(),否则文件将没有信息,因为awk也有缓存为了防止脚本被打断,可以使用nohup让脚本在后台执行:#下面不加fflush(),执行命令后会生成文件,并将信息打印到文件中nohuppingbaidu.com|awk'{printstrftime("%Y-%m-%d%H:%M:%S",systime())"\t"$0;fflush()}'>>long_ping.txt&$tail-flong_ping.txt2021-06-0910:45:54来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=2ttl=40time=83.3ms2021-06-0910:45:55来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=3ttl=40time=83.3ms2021-06-0910:45:56来自39.156.69.79(39.156)的64个字节.69.79):icmp_seq=4ttl=40time=83.3ms#结束后台进程,通过Findandkill方式如下$ps-ef|greppinguser00577830382010:45pts/200:00:00pingbaidu.comuser00713330382010:48pts/200:00:00grep--color=autoping$kill-95778[1]+完成nohuppingbaidu.com|awk'{printstrftime("%Y.%m.%d%H:%M:%S",systime())"\t"$0;fflush()}'>>long_ping.txt使用pong什么是pingpong?pingpong是一种数据缓存的手段,通过pingpong操作可以提高数据传输的效率。你什么时候需要乒乓球?两个模块之间交换数据时,上层处理的结果不能立即被下层处理,因此上层必须等待下层处理完成后才能发送新的数据,这对性能影响很大大损失。引入pingpong后,我们可以将结果保存在pong路的缓存中,而不是等待下一级处理结束。当pong路的数据准备好后,ping路的数据也处理好了(下一层),然后就不用等pong路的数据直接处理完了,上层也不需要等待,并将结果存储在ping路径中??。这提高了处理效率。nohuppingbaidu.com-i1|在阅读乒乓球时;做echo"$(date+"%Y-%m-%d%H:%M:%S")|$pong";完成|tee-aping-baidu.com.log&date时间戳数据戳转换日期可以将时间戳转换为本地时间。#date-d@1623205723.324359WedJun910:28:43CST2021#date--date=@1623205723.324359WedJun910:28:43CST2021用awk转换比较麻烦。awk拼接#格式可以自定义调整pingbaidu.com|awk'{“日期”|获取线路日期;打印日期,$0}'WedJun910:33:01CST202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=2ttl=40time=83.3msWedJun910:33:01CST202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=3ttl=40time=83.5msWedJun910:33:01CST202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=4ttl=40time=83.3ms#时间格式可根据日期自定义pingbaidu.com|awk-vdate="$(date+"%Y-%m-%d%r")"'{printdate,$0}'2021-06-0910:33:38AM64bytesfrom39.156.69.79(39.156.69.79):icmp_seq=1ttl=40time=83.3ms2021-06-0910:33:38AM64bytesfrom39.156.69.79(39.156.69.79):icmp_seq=2ttl=40time=83.5ms2021-06-0910:33:38AM来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=3ttl=40time=83.6msperl如果awk没有strftime()Notice:error"Can'tlocateTime/Piece.pm在@INC”中,你需要执行命令yum-yinstallperl-Time-Piece来安装必要的包。#要将其重定向到文件,请使用标准shell重定向并关闭输出缓冲:pingbaidu.com|perl-nle'printscalar(localtime),"",$_'WedJun910:36:14202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=2ttl=40time=83.4ms83.5msWedJun910:36:16202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=4ttl=40time=83.3ms#如果显示ISO8601时间格式pingbaidu.com|perl-nle'BEGIN{$|++}printscalar(localtime),"",$_'WedJun910:36:41202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=1ttl=40time=83.3msWedJun910:36:42202164bytesfrom39.156.69.79(39.156.69.79):icmp_seq=2ttl=40time=83.3msWedJun910:36:43202164bytesfrom39.156.69.79(39.156.69.79):3icttl=40time=83.5mspingbaidu.com|perl-nle'使用Time::Piece;BEGIN{$|++}printlocaltime->datetime,"",$_'2021-06-09T10:37:0864bytesfrom39.156.69.79(39.156.69.79):icmp_seq=1ttl=40time=83.4ms2021-06-09T10:37:09来自39.156.69.79(39.156.69.79)的64个字节:icmp_seq=2ttl=40time=83.4ms2021-06-09T10:37:10来自39.156.69.79(39.1596)的64个字节。:icmp_seq=3ttl=40time=83.2ms知识补充strftime补充:函数strftime()的操作有点类似于sprintf():识别以百分号(%)开头的格式化命令集,并格式化输出结果在一个字符串中的格式化命令说明了字符串strDest中各种日期和时间信息的准确表示。格式字符串中的其他字符将原封不动地放入字符串中。下面列出了格式命令,它们区分大小写。%a星期几的缩写%A星期几的全称%b月份的缩写%B月份的全称%c标准日期时间字符串%C年份的前两位%d日期十进制的月份%D月/日/年%e在双字符字段中,十进制的月份中的日期%F年-月-日%g年份的最后两位数,使用基于周的年份%G年份,usingweek-based星期几%h缩写的月份名称%H24小时格式的小时%I12小时格式的小时%j十进制的一年中的第几天%m十进制的月份%M十进制分钟%n换行符%pAM或PM的本地等价物%r12小时制%R显示小时和分钟:hh:mm%S十进制秒%t水平制表符%T显示小时、分钟和秒:hh:mm:ss%u一周中的第几天,星期一是第一天(取值从1到7,星期一是1)%U一年中的第一个星期,星期日是第一天(取值是from0to53)%V一年中的第几周,使用基于周的年份%w十进制的星期几(取值从0到6,星期日为0)%W一年中的第几周,使用星期一作为第一天(取值从0到53)%x标准日期字符串%X标准时间字符串%y没有世纪的十进制年份(取值从0到99)%Y带世纪部分的十进制年份%z,%Z时区名称,如果获取不到时区名称,则返回空字符。%%百分号语法strftime(format,timestamp)参数描述格式可选。指定如何返回结果。时间戳是可选的。时间戳,默认为当前本地awk补充:awk工作流程如下:先执行BEGING,然后读取文件,读取一条以/n换行符分隔的记录,然后根据指定的字段分隔符将记录分成字段,填写字段,$0表示所有字段,$1表示第一个字段,$n表示第n个字段,然后开始执行mode对应的action。然后开始读取第二条记录……直到读取完所有记录,最后执行END操作。print和printf补充:%s、%d或%c不能用于打印;打印自动换行,printf不自动换行
