91

I am trying to write a script that lists all the hosts on my LAN (there a about 20 of them) and writes the ping status next to each host. I have the DHCP leases file, so I have all the IPs (say, 10.0.0.1, 10.0.0.2, etc.), all I need is the ping status for each host.

So, my script launches a single ping for each host:

ping -c 1 10.0.0.1

Unfortunately, when a host is offline, the ping takes a long time to timeout. I checked man ping, there seem to be two options to set the timeout delay: -w deadline and -W timeout. I think I'm interested in the latter.

So I tried this:

ping -c 1 -W 1 10.0.0.1

But waiting one second per offline host is still too long. I tried to set it to below a second, but it does not seem to take the parameter into account at all:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently

Is there a way to set the timeout to a lower value? If not, are there any alternatives?

Edit

  • The O.S. is Debian Lenny.
  • The hosts I am trying to ping are actually access points. They are on the same vlan and subnet as the users (for simplicity of deployment and replacement). This is why I do not want to scan all the subnet (with a ping -b for example).

Edit #2

I accepted the fping solution (thanks for all the other answers). This command does exactly what I was looking for:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

This command takes at most 500ms to complete, and gives me the ping status of all the hosts at once:

10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss)
10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss)
10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss)
10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss)

10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71
10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95
10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1
10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0

On Debian Lenny, installation is trivial:

aptitude update
aptitude install fping

14 Answers 14

63

fping might be a better tool than the stock ping you are using. What OS are you on?

  • "fping differs from ping in that you can specify any number of targets on the command line, or specify a file containing the lists of targets to ping."
  • "Instead of sending to one target until it times out or replies, fping will send out a ping packet and move on to the next target in a round-robin fashion."
  • "Unlike ping, fping is meant to be used in scripts, so its output is designed to be easy to parse."

Example:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4
  • -c Number of request packets to send to each target.
  • -t Initial target timeout in milliseconds
1
  • 1
    Works great, thanks, this is what I was looking for. This command does the job fine: fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ... The whole thing lasts half a second, and I get the results for all hosts at once. Excellent tool. :-))
    – MiniQuark
    Nov 12, 2010 at 22:47
67

For people looking for a solution that involves ping, use the -i switch.

ping -i 0.2 www.google.com

Or, if you want to use 0.1, you'll need to run it as root

sudo ping -i 0.1 www.google.com

No need to download extra utilities.

10
  • 6
    +1 from me. This is the first result when googling "ping timeout", and this is exactly what I was looking for. Jul 30, 2015 at 21:27
  • 7
    In case of dead host this solution will print its first useful output after about 1 second. This is definitely wrong answer as @MarcelBurkhard already mentioned. Oct 7, 2017 at 22:14
  • 2
    The problem with this solution is that -i 0.1 will NOT wait 100ms, but longer, for pings that take more than 100ms, thus throwing the timing off. Mar 9, 2018 at 15:07
  • 15
    This answer is incorrect - it doesn't change how long ping will wait for a response - rather it just sends consecutive pings quicker....
    – Mtl Dev
    Oct 11, 2018 at 19:28
  • 1
    this is incorrect information because -i doesn't set timeout when ping takes longer. use timeout 0.1 pig -c1 $host instead (assuming linux)
    – AK_
    Nov 5, 2020 at 22:37
36

You can set a short timeout with the timeout command on Ubuntu/Debian:

timeout 0.2 ping -c1 fqdn || { do_work }
7
  • Good answer! I now did: timeout 1 ping -c 1 test.com
    – vrijdenker
    Feb 23, 2016 at 10:14
  • 1
    My version of timeout only accepts 1 second. timeout (GNU coreutils) 8.4.
    – slm
    Jul 22, 2016 at 20:05
  • i like this solution, it can be applied to all other commands
    – Dan D.
    Aug 9, 2017 at 3:20
  • @slm, it is strange that your version doesn't support less than a second. It works for me: DURATION is a floating point number with an optional suffix: 's' for seconds (the default),... In my case man timeout reports GNU coreutils 8.26. BWT, I'm using Ubuntu 17.04. Oct 7, 2017 at 22:26
  • This is actually the only thing that works if you want do decrease timeouts (host does not respond)... You have to do the math though: timeout must be greater than "-c" * "-i" of the ping command-
    – Marki
    May 20, 2019 at 17:22
18

I would be using nmap for this task.

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

See the nmap Documentation for more details on this.

5
  • Good call.. This is the "Awesome" way to do it :D +1
    – Arenstar
    Nov 10, 2010 at 20:37
  • Hi, I just tried this, but I got the following error message: "--host-timeout is specified in milliseconds unless you qualify it by appending 's', 'm', 'h', or 'd'. The value must be greater than 1500 milliseconds".
    – MiniQuark
    Nov 11, 2010 at 8:46
  • I think the problem is obvious, the timeout can't be shorter than 1500ms. Than you should look for the nmap options regaring parallelism I think.
    – pacey
    Nov 11, 2010 at 9:08
  • This seems to only send one request. I am looking for continuous fault detection, I got here by Googling "ping millisecond timeout", Does nmap offer infinie-pings like ubuntu ping does? Jun 26, 2014 at 16:20
  • setting the timeout to something lower than a second will involve using a privileged user as in @victor-bjelkholm answer
    – thrau
    Jan 3, 2016 at 0:26
15

Use -w switch, both on Windows and Debian.

It's a quick way to check if machine responds at all, assuming it'll respond in time less then specified amount of seconds.

ping -w 1 192.168.80.105

PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data.

--- 192.168.80.105 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
1
  • For ubuntu is is -W (capital w) -w <deadline> reply wait <deadline> in seconds And -W <timeout> time to wait for response
    – M at
    Sep 25, 2021 at 19:01
5

you may want to look at arp ping tool if all your hosts are on the physical LAN.It does the same thing but uses layer 2 arp packets to do the 'ping'. You can use a combination of arpping and icmp ping, or in fact tcp ping, to gather what the failure is. EXample is a tcp stack crash, although rare these days, we could find if a machine tcp stack had crashed, as the machine would not respond to ping, however it would respond to arp (which is a different piece of code on the host).

using a combination of arpping, tcpping, and icmp ping you can find out if the service on the machine has crashed, the tcp stack has crashed, or the machine has locked up completely. If you have managed ethernet switches you can get physical link data, revealing if the machine is actually switched on, or had been physically unplugged. We had a situation where machines (clients in public rooms) would be switched off, we gathered that data and the sent wake on lan packets, to power up the machines. :-)

What ever solutions you build, if your network is busy, think about implementiing some kind of qos , so that your monitoring packets take priority on the network, losing measurement packets due to network congestion can give false alarms. If do use qos for monitoring packets, then you'll need to think about gathering data about network utilisation.

So, you can make your monitoring solution as complex or as easy as you like. We find even the most elementary monitoring system is a step in the right direction, at least some administrator is keeping any eye on machines :-).

good luck!

5

@jordon-bedwell has a great suggestion.

@laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux explains that ping timeouts only start after the ip address has been determined. If you use a dns and your workstation is offline then ping cannot determine the ip address and so appears to wait approximately a default 20+secs before returning false.

Using the linux 'timeout' tool provides more control when running ping with a domain name.

Thanks Guys

1
  • Thank you for adding DNS to the discussion on this well-ranking question. If anyone has suggestions on how to accomplish the same timeout functionality on stock macOS (and Windows I guess), it would round out the ping scripting tools.
    – joshfindit
    Sep 26, 2022 at 14:06
2

On macOS, to set the time ping waits for a response form the server before deciding its a non-response (timeout) is -t:

ping -t 1 -c 1 host
1
  • note this is the total time ping will wait, if using higher count of pings -- to set the wait time for each individual ping, use -W as on Gnu/Linux, except on MacOS the time units are milliseconds Oct 5, 2022 at 13:50
1

If you can scan your subnet (or part of it) without triggering security alarms, and don't mind a bit of extra data, Angry IP Scanner is fast, free, lets you click to sort by status, and can provide more detailed information.

0

Why not launch ping in the background, with output to a temporary file, in parallel for every host? Then sleep for one second, kill any ping processes that are still running, and read the files to collect the output.

2
  • 1
    I guess it would work, but I was looking for a simpler solution. Thanks anyway.
    – MiniQuark
    Nov 11, 2010 at 8:51
  • This method doesn’t scale up.
    – Synetech
    Jul 7, 2016 at 15:31
0

The timeout is an integer value indicating how far and long the packet can be sent. Values below 1 are meaningless. A value of 1 indicates you are pinging immediate neighbors only.

The only way to speed things up is to run a background check and harvest the results. This is what tools like Nagios do.

2
  • 2
    I'm sorry, but I really don't think this is true. The man page is pretty clear that -W specifies the "Time to wait for a response, in seconds"; it's not dimensionless, and although ping doesn't honour values below 1 (hence the question) sub-second timeouts are not meaningless. If you'll forgive me, you may be confusing -W with -t, the latter setting the IP TTL (hop count) field, which does behave as you have described, and where values below 1 are indeed meaningless.
    – MadHatter
    Nov 11, 2010 at 8:56
  • -W is th time the ping process waits for a response, and it may make sense in to set it well below the hop count when hop count is high, which it normally is. By three seconds you are usually getting into retry conditions. Some tools may allow the use of a finer grained timer for waits, but for most uses of ping, seconds are a reasonable unit.
    – BillThor
    Nov 12, 2010 at 20:25
0

You could try something like this. But it takes 15 minutes to run.

a=258
while [ $a -ge 1 ]
do
    echo "10.0.0.$a"
    sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log
   a=`expr $a - 1`
done
cat /home/$USER/output.log|grep -i "icmp_req=1"
cat /dev/null>/home/$USER/output.log
1
  • Looks like nmap would be the right tool for the job.
    – kasperd
    Dec 2, 2015 at 9:07
0

try this:

ping -n 5 1.2.3.4.5 >nul
1
  • How is this better than fping?
    – chicks
    Mar 13, 2017 at 20:25
-2

ping has [-t timeout] and [-W waittime] options so you could do:

ping -c 1 -t 1 -W 1 google.com

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .