-   Linux - Networking (
-   -   Script to check connection (and restart network if down) (

mac_phil 12-03-2004 06:42 PM

Script to check connection (and restart network if down)
I leave my desktop online 24/7, and often SSH into it when I'm away.

Every once in awhile the system loses its network connection. (This is with DHCP.)

If I'm home, I can just type 'service network restart'. If I'm not home, I'm screwed.

How would I write a simple script to do the following every 15 minutes:

1)Check if the network is up
1a) If up, exit.
2b) If down, issue command 'service network restart' and goto 1.

I understand the basic ideas, that 1 will probably involve pinging some host, but I don't know how to write such a script.


scowles 12-03-2004 08:17 PM

1) copy/paste the following lines into a new file named /usr/local/bin/check_network. Change the ROUTER_IP variable to the IP address that can verify that your network is up.


( ! ping -c1 $ROUTER_IP >/dev/null 2>&1 ) && service network restart >/dev/null 2>&1

2) Add the following line to /etc/crontab. Change the */2 to whatever increment you want to have this script run in minutes. It's currently set to run /usr/local/bin/check_netowork every two minutes.

*/2 * * * * root /usr/local/bin/check_network
3) Set the execute permissions on the script. As root, type:
chmod +x /usr/local/bin/check_network.

thats it!

mac_phil 12-05-2004 01:24 AM

Thanks! That is really helpful.

VibeOfOurTribe 12-09-2004 01:44 PM

Ok, I guess I don't really unerstand the 2>&1 part of the script, but your script does not appear to be correct. Here is an example (I removed the >/dev/null so I could see what is going on):

My network is alive and I type:

(ping -c1 2>&1) && echo "true"
Here is what that does:
"PING ( 56(84) bytes of data.

--- ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms"

notice it doesn't echo "true", which if I'm understanging your script correctly, it should.

So if I do:

(! ping -c1 2>&1) && echo "true"
again, while my network is up it says.
"PING ( 56(84) bytes of data.

--- ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms


According to this, your script


( ! ping -c1 $ROUTER_IP >/dev/null 2>&1 ) && service network restart >/dev/null 2>&1

the network will get restarted even if it's up. Removing the "!" seems to have the desired effect, but it just looks incorrect. What is going on here? Possibly our versions of the "ping" program have different implementations?

mac_phil 12-09-2004 02:08 PM

Yes, it seems there is something slightly wrong with the script.

My network connection usually dies about once every three weeks. I've been running this script nonstop for about five days, and it has restarted my network at least 15 times. So it is giving some false positives for the network being down.

VibeOfOurTribe 12-09-2004 02:13 PM

Ok here is a script that works beautifully for me:

x=`ping -c1 2>&1 | grep unknown`
if [ ! "$x" = "" ]; then
        echo "It's down!! Attempting to restart."
        service network restart

This script works because if the network is down, ping will return "ping: unknown host". If it is up then the word "unknown" shouldn't lie anywhere in the output.

Hope that works for you too!

VibeOfOurTribe 12-09-2004 02:21 PM

also, to be on the safe side in my crontab i put a second line which restarts the network every hour regardless. So my crontab for root looks like this:


*/2 * * * * /usr/local/bin/check_network
0 * * * *    service network restart > /dev/null

mac_phil 12-09-2004 02:21 PM

I'll give that one a try, thanks!

hande1 10-14-2009 09:48 AM

A similar script
Did you have any luck with this Phil?

I'm looking to do something similar but I'm not overly familiar with bash scripting so it's driving me mad.

In an ideal world my script would ping 3 different IPs in turn, and if packet loss on either link exceeded say, 10%, a set of actions would be taken to restart the link:

a) Restart networking
b) Restart networkmanager
c) Ask networkmanager to dial up my link again (using cnetworkmanager as a command line utility )

I have the latter commands, but am struggling to structure and build a script to perform the above logic.

Any gurus fancy offering their kind assistance?

abibibo 01-05-2010 10:10 PM

Hande: If it's not too late, here's something I just wrote for my own use. It should be simple to modify such that it tests packet loss for multiple IP's and acts based on the average. Run using the crontab examples posted previously.


#!/usr/bin/env bash

# Script to monitor and restart wireless access point when needed

maxPloss=10 #Maximum percent packet loss before a restart

restart_networking() {
        # Add any commands need to get network back up and running
        /etc/init.d/networking restart

        #only needed if your running a wireless ap
        /etc/init.d/dhcp3-server restart

# First make sure we can resolve google, otherwise 'ping -w' would hang
if ! $(host -W5 > /dev/null 2>&1); then
        #Make a note in syslog
        logger "wap_check: Network connection is down, restarting network ..."

# Initialize to a value that would force a restart
# (just in case ping gives an error and ploss doesn't get set)
# now ping google for 10 seconds and count packet loss
ploss=$(ping -q -w10 | grep -o "[0-9]*%" | tr -d %) > /dev/null 2>&1

if [ "$ploss" -gt "$maxPloss" ]; then
        logger "Packet loss ($ploss%) exceeded $maxPloss, restarting network ..."

hande1 01-06-2010 06:19 AM

Thanks abibibo!

All times are GMT -5. The time now is 06:34 PM.