有没有办法告诉我们ping
在不停止执行的情况下显示其通常的终止统计信息?
例如,我想快速查看:
--- 8.8.8.8 ping statistics ---
2410 packets transmitted, 2274 received, +27 errors, 5% packet loss, time 2412839ms
rtt min/avg/max/mdev = 26.103/48.917/639.493/52.093 ms, pipe 3
无需停止程序,从而丢失累积的数据。
答案1
从ping
联机帮助页(强调我的):
当发送(和接收)指定数量的数据包或程序因 SIGINT 终止时,将显示简短的摘要。无需使用信号 SIGQUIT 终止进程即可获得较短的当前统计数据。
因此,如果您愿意让统计数据稍微不那么冗长,那么这将起作用:
# the second part is only for showing you the PID
ping 8.8.8.8 & jobs ; fg
<... in another terminal ...>
kill -SIGQUIT $PID
简短的统计数据如下所示:
19/19 packets, 0% loss, min/avg/ewma/max = 0.068/0.073/0.074/0.088 ms
答案2
有一种更简单的方法可以在执行期间获取 ping 统计信息:只需按Ctrl + |(竖斜线或也称为管道线)
我个人经常使用它,尝试一下:
64 bytes from 192.168.1.1: icmp_seq=6 ttl=64 time=0.893 ms
64 bytes from 192.168.1.1: icmp_seq=23 ttl=64 time=0.862 ms
64 bytes from 192.168.1.1: icmp_seq=24 ttl=64 time=3.18 ms
64 bytes from 192.168.1.1: icmp_seq=35 ttl=64 time=0.877 ms
64 bytes from 192.168.1.1: icmp_seq=36 ttl=64 time=0.866 ms
**36/36 packets, 0% loss, min/avg/ewma/max = 0.832/0.993/0.930/3.185 ms**
64 bytes from 192.168.1.1: icmp_seq=37 ttl=64 time=0.909 ms
64 bytes from 192.168.1.1: icmp_seq=38 ttl=64 time=2.03 ms
64 bytes from 192.168.1.1: icmp_seq=39 ttl=64 time=0.839 ms
64 bytes from 192.168.1.1: icmp_seq=40 ttl=64 time=0.880 ms
答案3
Linux(在 Ubuntu 20.04 上测试)
发送SIGQUIT
信号。
输出示例:
64 bytes from localhost (127.0.0.1): icmp_seq=138 ttl=64 time=0.021 ms
64 bytes from localhost (127.0.0.1): icmp_seq=139 ttl=64 time=0.022 ms
139/139 packets, 0% loss, min/avg/ewma/max = 0.014/0.022/0.022/0.057 ms
64 bytes from localhost (127.0.0.1): icmp_seq=140 ttl=64 time=0.090 ms
64 bytes from localhost (127.0.0.1): icmp_seq=141 ttl=64 time=0.025 ms
跑步时发送
CTRL+ \=quit
根据stty -a
.
这些也有效:CTRL+ |; CTRL+ 4;
发送到一个或多个已知的 pid
kill -SIGQUIT <pid> [...]
发送给所有正在运行的人
ps -o pid= -C ping | xargs -r kill -SIGQUIT
定期发送给所有正在运行的
while sleep 20; do ps -o pid= -C ping | xargs -r kill -SIGQUIT; done
作为后台工作
while sleep 20; do ps -o pid= -C ping | xargs -r kill -SIGQUIT; done &
FreeBSD(在 pfSense 2.4.5 上测试,基于 FreeBSD 11.3)
发送INFO
信号。
CTRL通过+发送时的示例输出T:
64 bytes from 127.0.0.1: icmp_seq=137 ttl=64 time=0.328 ms
64 bytes from 127.0.0.1: icmp_seq=138 ttl=64 time=0.028 ms
load: 0.18 cmd: ping 62483 [select] 144.69r 0.00u 0.01s 0% 2256k
139/139 packets received (100.0%) 0.018 min / 0.072 avg / 0.505 max
64 bytes from 127.0.0.1: icmp_seq=139 ttl=64 time=0.116 ms
64 bytes from 127.0.0.1: icmp_seq=140 ttl=64 time=0.027 ms
通过以下方式发送时的示例输出kill
:
64 bytes from 127.0.0.1: icmp_seq=137 ttl=64 time=0.328 ms
64 bytes from 127.0.0.1: icmp_seq=138 ttl=64 time=0.028 ms
139/139 packets received (100.0%) 0.018 min / 0.072 avg / 0.505 max
64 bytes from 127.0.0.1: icmp_seq=139 ttl=64 time=0.116 ms
64 bytes from 127.0.0.1: icmp_seq=140 ttl=64 time=0.027 ms
跑步时发送
CTRL+ T=status
根据stty -a
.
发送到一个或多个已知的 pid
kill -INFO <pid> [...]
发送给所有正在运行的人
ps -o comm= -o pid= | egrep '^ping[[:space:]]' | awk -F' ' '{print $2}' | xargs -r kill -INFO
定期发送给所有正在运行的
printf "while ({ sleep 20 })\nps -o comm= -o pid= | egrep '^ping[[:space:]]' | awk -F' ' '{print \0442}' | xargs -r kill -INFO\nend\n" | tcsh
作为后台工作
printf "while ({ sleep 20 })\nps -o comm= -o pid= | egrep '^ping[[:space:]]' | awk -F' ' '{print \0442}' | xargs -r kill -INFO\nend\n" | tcsh &
注释和致谢
感谢@pmos 的回答,它首先为我播下了周期性方法的想法,并感谢所有其他对此做出贡献的答案和评论。
谢谢@VictorYarema提出建议我转身我的评论变成一个实际的答案。原始评论中的方法的本质是相同的,但随着时间的推移已经演变如下:
- 添加了
-r
选项以防止在没有结果时在没有 pid 的情况下xargs
运行kill
ps
- 为了摆脱标题行,
ps
我使用了-o pid=
将列标题文本设置为空的选项,而不是h
因为h
对于 Linux 和 FreeBSD 有不同的含义- 虽然Linux 中
ps
支持显式--no-headers
选项,但 FreeBSD 则不然
- 虽然Linux 中
- 将
sleep
命令移至while
测试条件 - 删除了不必要的引号
- 移植到 FreeBSD
- 感谢这些答案让我能够在 tcsh 中写一个单行 while 循环这反过来要求我打印$用于
awk
- 感谢这些答案让我能够在 tcsh 中写一个单行 while 循环这反过来要求我打印$用于
答案4
尝试Ctrl+4
它显示这样的一行:
312/312 packets, 0% loss, min/avg/ewma/max = 0.312/1.236/0.505/208.655 ms