traller
Goto Top

If else Verschachtelung für Ping-Check in Shell

Hallo,
ich möchte in dieses Script einen doppelten Ping-Check einbauen. Das ganze läuft auf einem DD-WRT Router Aktuell sieht es so aus:
#!/bin/sh
INTERVAL=10
PACKETS=1
VPN="openvpn --config /tmp/openvpncl/openvpn.conf --route-up /tmp/openvpncl/route-up.sh --down-pre /tmp/openvpncl/route-down.sh --daemon"  
IFACE=tun1
TARGET=192.168.0.1


ME=`basename $0`
RUNNING=`ps | awk '/'"$ME"'/ {++x}; END {print x+0}'`  
if [ "$RUNNING" -gt 3 ]; then  
   echo "Another instance of \"$ME\" is running"  
   exit 1
fi

while sleep $INTERVAL
do
   RET=`ping -c $PACKETS $TARGET 2> /dev/null | awk '/packets received/ {print $4}'`  

   if [ "$RET" -ne "$PACKETS" ]; then  
      echo "Ping failed, releasing IP address on $IFACE"  
	#send a RELEASE signal
		kill $(ps | grep "openvpn --config /tmp/openvpncl/openvpn.conf --route-up /tmp/openvpncl/route-up.sh --down-pre /tmp/openvpncl/route-down.sh --daemon" | head -c 5 )  
	#ensure udhcpc is not running
      killall openvpn 2> /dev/null
      echo "Renewing IP address: $IFACE"  
      $VPN
      echo "Waiting 10 s..."  
      sleep 10
   else
      echo "Network is up via $TARGET"  
   fi
done
was ich nun auslösen möchte ist folgendes: die Überprüfung mit dem Ping erfolgt einmal. Wenn dieser funktioniert, geht er halt weiter zu "Network is up via $TARGET". Wenn der Ping fehl schlägt, sollen 10 Sekunden gewartet werden und es folgt der zweite Ping-Test. Im Falle von ok geht es wieder zu "Network is up via $TARGET" und alles beginnt von vorne. Falls der zweite Test fehl schlägt soll er das alles unter then mit dem kill-Befehl ausführen. Ich möchte also den Ping-Check doppelt haben. Wie bekomme ich das hin?

Mein eigener Entwurf mit
#!/bin/sh
INTERVAL=10
PACKETS=1
VPN="openvpn --config /tmp/openvpncl/openvpn.conf --route-up /tmp/openvpncl/route-up.sh --down-pre /tmp/openvpncl/route-down.sh --daemon"  
IFACE=tun1
TARGET=192.168.0.1


ME=`basename $0`
RUNNING=`ps | awk '/'"$ME"'/ {++x}; END {print x+0}'`  
if [ "$RUNNING" -gt 3 ]; then  
   echo "Another instance of \"$ME\" is running"  
   exit 1
fi

while sleep $INTERVAL
do
   RET=`ping -c $PACKETS $TARGET 2> /dev/null | awk '/packets received/ {print $4}'`  

if [ "$RET" -ne "$PACKETS" ]  
   then 
		{
		echo "Ping failed, releasing IP address on $IFACE"  
		sleep 10
		}
	elif [ "$RET" -ne "$PACKETS" ]  
		then
		{
			#send a RELEASE signal
			kill $(ps | grep "openvpn --config /tmp/openvpncl/openvpn.conf --route-up /tmp/openvpncl/route-up.sh --down-pre /tmp/openvpncl/route-down.sh --daemon" | head -c 5 )  
			#ensure udhcpc is not running
			killall openvpn 2> /dev/null
			echo "Renewing IP address: $IFACE"  
			$VPN
			echo "Waiting 10 s..."  
			sleep 10 
		}
	else
		echo "Network is up via $TARGET"  
   fi
done
scheint nicht zu funktionieren. Jedenfalls passiert nach dem ersten fehlgeschlagenen Ping-Test nichts weiter ...

Content-Key: 270362

Url: https://administrator.de/contentid/270362

Printed on: April 18, 2024 at 13:04 o'clock

Mitglied: 114757
114757 Apr 26, 2015 updated at 14:27:23 (UTC)
Goto Top
Moin,
hier siehst du wie sowas geht, ohne den ganzen überflüssigen Kram der Ausgabe von Ping:
http://www.michael-fuchs.net/rubriken/edv/scripts/watchip.html

Mit break kannst du dann bei Bedarf an der gewünschten Stelle aus dem While-Loop springen.

Gruß jodel32