How to show failed ping?

The right answer is: there is no such thing as "failed lost ping". (Failure replies like "Destination unreachable" are always printed, it is different from no reply at all.)

Ping utility prints every received reply, even if it eatlier decided that this specific ping was lost. It is entirely possible to receive replies out of order.

Even on my Android phone, stock ping utility supports these 2 options:
-D prints a timestamp before every message
-O prints a message when reply is not received in time, and it is more or less what was asked.
However, these options do not seem to be supported everywhere (e.g. Debian Wheezy lacks them as far as I know, while Jessie has them. busybox ping does not support them).

Here is an example output I managed to get (unimportant ping replies skipped):

u0_a93@NX505J:/ $ ping -D -O 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[1440545014.805478] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=244 time=116 ms
~~~~~~~~~~
[1440545142.995443] 64 bytes from 8.8.8.8: icmp_seq=129 ttl=244 time=110 ms
[1440545144.885601] no answer yet for icmp_seq=130
[1440545145.455485] 64 bytes from 8.8.8.8: icmp_seq=131 ttl=244 time=568 ms
[1440545145.455780] 64 bytes from 8.8.8.8: icmp_seq=130 ttl=244 time=1569 ms
[1440545146.005850] 64 bytes from 8.8.8.8: icmp_seq=132 ttl=244 time=119 ms
~~~~~~~~~~
[1440545254.055962] 64 bytes from 8.8.8.8: icmp_seq=240 ttl=244 time=115 ms
^C
--- 8.8.8.8 ping statistics ---
240 packets transmitted, 240 received, 0% packet loss, time 239250ms
rtt min/avg/max/mdev = 109.062/138.757/1569.620/101.608 ms, pipe 2

Note how #130 is first reported missing, then received after #131, and finally packet loss is reported to be zero.


Extra note about Windows:

On Windows, ping seems to wait for reply longer and then declare it missing and ignore it if it comes later.

By default, interval is 1 second and timeout is 4 seconds, so:
On low RTT, pings will be sent with 1-second intervals.
On RTT>4, pings will be sent with 4-second intervals (or 5, not sure) and will all be reported as failed, same as if server did not respond.


Going partially off the answer by EvgEnZh, but with my own version:

ping -O -q 8.8.8.8

That makes it print a message when a reply takes too long or never comes back (-O) and suppresses messages for when they do come back (-q). The result is that you only get output when packets go missing. This can make finding intermittent problems much easier by making it so you don't have to sift through a pile of "it worked" messages for the few places it broke.


Maybe ping -f is suitable for you. From ping manual:

-f

Flood ping. For every ECHO_REQUEST sent a period ''.'' is printed, while for ever ECHO_REPLY received a backspace is printed. This provides a rapid display of how many packets are being dropped. If interval is not given, it sets interval to zero and outputs packets as fast as they come back or one hundred times per second, whichever is more. Only the super-user may use this option with zero interval.

For 1 echo_request every second it would look like ping -i 1 -f 8.8.8.8

Tags:

Ping