Ich möchte prüfen, ob ein Server eine Verbindung zum Internet hat oder nicht. Ich habe erfolglos versucht, das folgende Skript auszuführen, das alle 5 Minuten ausgeführt wird, prüft und eine E-Mail sendet, wenn eine Verbindung zum Internet besteht.
ping -c 3 192.168.0.25 > /dev/null 2>&1
if [ $? -eq 0 ]
then
mailx -s "Server is Up" -t "[email protected]" < /dev/null
fi
Das Problem besteht jedoch darin, dass ich alle 5 Minuten eine E-Mail erhalte, sobald die Verbindung hergestellt ist. Wie kann ich das beheben?
Antwort1
Weil man nicht über einen Status, sondern über eine Statusänderung benachrichtigt werden möchte. Man muss sich also irgendwo merken, was der vorherige Status war, etwa so:
#! /bin/bash
statusFile=/var/tmp/connected # used to remember status
pingedHost=8.8.8.8
checkPeriod=5 # seconds
while true
do
echo "Sleeping..."
sleep $checkPeriod
echo "Checking..."
ping -c 1 $pingedHost > /dev/null 2>&1
if [[ $? -eq 0 ]]
then
echo "Ping OK..."
if [[ ! -f $statusFile ]] # not connected already
then
echo "Reconnected..."
# send reconnection mail here
touch $statusFile # remember state
fi
else
echo "Ping KO..."
if [[ -f $statusFile ]] # was connected before
then
echo "Disconnected..."
# send disconnection mail here
rm $statusFile # remember state
fi
fi
done
Antwort2
Es könnte besser sein, zu prüfen, ob das Ergebnis Null ist, anstatt ein -e, oder?
if [$? -eq 0]
Oder dieses
if [$? -e 0]
ist nur ein Tippfehler?