このブログはURLが変更になりました

新しいブログはこちら→ https://matsuu.hatenablog.com/

ping中に統計情報を表示するショートカット(MacでもLinuxでもWindowsでも)

pingを打ち続けている最中に、平均遅延時間や平均ロス率などを知りたい、でもここで止めたら最初からやりなおし、ぐぬぬ、といった経験ありませんか?ありますよね?ね?

実は大抵のpingコマンドには、ping中に統計情報を表示する機能が実装されています。

BSD系(Mac OS X含む)の場合、Ctrl+t(SIGINFO)で

manに記載がありました。

If ping receives a SIGINFO (see the status argument for stty(1)) signal, the current number of packets sent and received, and the minimum, mean, and maximum of the round-trip times will be written to the standard error output.

SIGINFOを送れば統計情報が表示されます。SIGINFOはCTRL+tで送ることができます(Mac OS X標準のTerminalの場合)。

% ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.050 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.072 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.082 ms (←ここでCTRL+t)
load: 0.22  cmd: ping 22171 running 0.00u 0.00s
3/3 packets received (100.0%) 0.050 min / 0.068 avg / 0.082 max
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.061 ms

iTermはCtrl+tでSIGINFOが送られないようです。そんな場合はkillコマンドで送りましょう。

% kill -INFO <pingのPID>

Linux(iputils)の場合、CTRL+\(SIGQUIT)で

manによると、iputilsのpingにはSIGQUITを送ればいいようです。

Shorter current statistics can be obtained without termination of process with signal SIGQUIT.

一般的なターミナルであれば、CTRL+\でSIGQUITを送ることができます。

$ ping 
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.027 ms
64 bytes from 127.0.0.1: icmp_req=2 ttl=64 time=0.025 ms
64 bytes from 127.0.0.1: icmp_req=3 ttl=64 time=0.024 ms (←ここでCTRL+\)
3/3 packets, 0% loss, min/avg/ewma/max = 0.024/0.025/0.026/0.027 ms
64 bytes from 127.0.0.1: icmp_req=4 ttl=64 time=0.030 ms
...

CTRL+\が利かない場合はkillコマンドでどうぞ。

$ kill -QUIT <pingのPID>

Windowsの場合、CTRL+Breakで

pingコマンドのヘルプに書かれてました。

> ping
Usage: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
            [-r count] [-s count] [[-j host-list] | [-k host-list]]
            [-w timeout] target_name

Options:
    -t             Ping the specified host until stopped.
                   To see statistics and continue - type Control-Break;
                   To stop - type Control-C.
え?Breakって何?そんなキーあったっけ?

えぇ、あります。キーボードを良くみてください。PrintScreenキー、ScrollLockキーの横あたりにPause/Breakキーがありませんか?
http://upload.wikimedia.org/wikipedia/commons/8/8c/Key_break.jpg
それです。ノートパソコンの場合、Fnキーを押しながらかもしれません。

> ping -t 127.0.0.1
Pinging 127.0.0.1 with 32 bytes of data:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 (←ここでCTRL+Break)

Ping statistics for 127.0.0.1:
    Packets: Sent = 6, Received = 6, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Control-Break
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

注意 一部のping実装では使えません(例えばbusyboxとか)

busybox pingにSIGQUITを送ると統計情報も出さずに即終了してしまうので注意しましょう。

# busybox ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.050 ms
64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.049 ms
64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.056 ms (←ここでCTRL+\)
#  (←統計情報は表示されずプロンプトに戻った)

他にもddコマンドでUSR1とか

ddコマンドにSIGUSR1を送ると途中経過を表示することができます。
コマンドによって何を送るべきかは異なるので、それぞれ調べてから使いましょう。