显示实时的 Ping 替换

显示实时的 Ping 替换

是否有 ping 替代品,除了显示往返时间和序列号外,还能显示系统的日期/时间?我更喜欢在 Linux 上运行的工具,但如果有可以在 Windows 上运行的 cli 工具,那也很好。

有用户报告称,系统间歇性地暂停。这似乎不会在任何一致的时间发生。我无法让报告用户足够具体地告诉它何时发生,以便能够关联暂停任何日志。

其中一名技术人员让主机运行了一天的 ping。往返时间一度变得非常长。我试图弄清楚这种情况究竟发生的时间,以便缩小我应该查看的日志条目的范围,并可能将其关联起来暂停我可能还能通过性能日志、设备日志等收集其他数据。

64 bytes from 10.2.4.241: icmp_seq=1825 ttl=64 time=0.321 ms
64 bytes from 10.2.4.241: icmp_seq=1826 ttl=64 time=0.371 ms
64 bytes from 10.2.4.241: icmp_seq=1827 ttl=64 time=13937.638 ms
64 bytes from 10.2.4.241: icmp_seq=1828 ttl=64 time=12937.526 ms
64 bytes from 10.2.4.241: icmp_seq=1829 ttl=64 time=11937.392 ms
64 bytes from 10.2.4.241: icmp_seq=1830 ttl=64 time=10937.275 ms
...
64 bytes from 10.2.4.241: icmp_seq=1840 ttl=64 time=936.073 ms
64 bytes from 10.2.4.241: icmp_seq=1841 ttl=64 time=0.410 ms

答案1

您可以使用 perl 添加时间戳,如下所示:

ping 127.0.0.1 | perl -pe 'BEGIN {use POSIX;} print strftime("%Y-%m-%d %H:%M:%S ", localtime)'

答案2

这是一个 bash 解决方案:)

$ ping localhost | 当读取行时;执行 echo -e "$(date)\t $line" ; 完成
2009 年 11 月 3 日星期二 04:46:26 MSK PING 本地主机 (127.0.0.1) 56(84) 字节数据。
星期二 11 月 3 日 04:46:26 MSK 2009 64 字节来自本地主机 (127.0.0.1):icmp_seq=1 ttl=64 时间=0.033 毫秒
星期二 11 月 3 日 04:46:27 MSK 2009 64 字节来自本地主机 (127.0.0.1):icmp_seq=2 ttl=64 时间=0.040 毫秒
星期二 11 月 3 日 04:46:28 MSK 2009 64 字节来自本地主机 (127.0.0.1):icmp_seq=3 ttl=64 时间=0.046 毫秒
星期二 11 月 3 日 04:46:29 MSK 2009 64 字节来自本地主机 (127.0.0.1):icmp_seq=4 ttl=64 时间=0.046 毫秒

现在,让我们让date命令产生更加漂亮的输出:

$ ping localhost | 当读取行时;执行 echo -e "$(date +%H:%I:%S)\t $line" ; 完成
04:04:13 PING 本地主机(127.0.0.1)56(84)字节数据。
04:04:13 来自本地主机 (127.0.0.1) 64 字节:icmp_seq=1 ttl=64 时间=0.044 毫秒
04:04:14 来自本地主机 (127.0.0.1) 的 64 字节:icmp_seq=2 ttl=64 时间=0.039 毫秒
04:04:15 来自本地主机 (127.0.0.1) 的 64 字节:icmp_seq=3 ttl=64 时间=0.042 毫秒

干杯!

答案3

我们用来定期检查延迟和数据包丢失的“更重”的选项是吸烟。它不仅能以更易读的格式为您提供更多信息,而且您还可以执行 HTTP 和 DNS 检查等操作,而不必依赖 ICMP。许多防火墙和路由器会降低 ICMP 的优先级,从而导致错误的延迟测量。

吸烟

答案4

printf让我们使用带有格式规范的内置 shell%(datefmt)T来避免调用更重的解释器或date为每一行产生新的进程。

ping -c4 localhost | while read line; do printf "%([%Y-%m-%dT%H:%M:%S])T %s\n" "-1" "$line"; done

与 perl 示例一样,这也可以通过管道传输到 sed 和 awk 来实现。我认为这ts是最简单的方法,但我们的服务器上没有这个。对于 busybox 等环境也是如此。

如果您的命令缓冲其输出,则可以使用unbuffer

相关内容