Ich habe also einen Server und einen Client-Computer, die ich ständig im Netzwerk laufen lassen muss. Manchmal stürzt mein Client-Computer ab, weil ich ihn im WLAN
Netzwerk laufen lasse, sodass ich ihn neu starten muss. Da ich sicherstellen möchte, dass eine aktive Verbindung zwischen meinem Server und Client besteht, muss ich irgendwie in der Lage sein, regelmäßig zu prüfen, ob der Client-Computer aktiv oder reaktionsfähig ist.
Mein Problem
Ich muss zuerst das Netzwerk neu starten, wenn der Client innerhalb von fünf Minuten keinen solchen Konnektivitäts-Ping von meinem Server empfängt, und wenn das Netzwerk neu gestartet wurde und immer noch keine solchen Pakete von meinem Server empfängt, wird die gesamte Linux-Maschine neu gestartet.
Die Idee besteht darin, dass mein Server wie ein Watchdog agiert, der jede Minute einen Konnektivitäts-Ping an meinen Client sendet, und wenn der Client innerhalb von fünf Minuten keinen solchen Ping empfängt, versucht er, sich selbst neu zu initialisieren.
Was ich versucht habe
Ich habe mit diesem lokalen Skript versucht zu prüfen, ob es meinen Server von meinem Client aus anpingen kann, aber es hat nicht funktioniert, deshalb möchte ich es stattdessen von meinem Server aus prüfen.
#!/bin/bash
test_ping=`ping -c 4 SERVER_ADDR | tail -1| awk '{print $4}' | cut -d '/' -f 2`'>'1000 | bc -l
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] || [ "$test_ping" == "1"] ;
then
echo "restarting network at $(date '+%A %W %Y %X')" >> /path/to/my/logs.file
service networking restart
sleep 60
test_ping=`ping -c 4 SERVER_ADDR | tail -1| awk '{print $4}' | cut -d '/' -f 2`'>'1000 | bc -l
test_host=`netstat -nr | grep "UG" | awk '{ print $2}' | xargs ping -q -w 1 -c 1 | grep "received" | awk '{ print $4 }'`
if [ "$test_host" == "0" ] || [ -z "$test_host" ] || [ "$test_ping" == "1"] ;
then
echo "rebooting at $(date '+%A %W %Y %X')" >> /path/to/my/logs.file
reboot
fi
fi
Irgendwelche Ideen, wie ich das unter Linux erreichen kann?
Antwort1
Ich habe mein Problem "gelöst", indem ich ssh
eine temporäre Datei auf dem Client erstellt habe
ssh -o ConnectTimeout=5 USER@CLIENT_HOST '/usr/bin/touch /tmp/watchdog.hook'
Dies wurde auf meinem Server jede Minute von cron mit dem folgenden cron-Befehl aufgerufen
* * * * * /path/to/script/watchdog-server.sh
Auf der Clientseite versuche ich, die temporäre Datei zu löschen. Wenn dies fehlschlägt, wird ein Zähler hochgezählt. Wenn er drei ergibt, wird das Netzwerk neu gestartet. Wenn er fünf ergibt, wird die Maschine neu gestartet. Wenn dies gelingt, wird der Zähler zurückgesetzt.
counter_file="/tmp/watchdog.counter"
if [ ! -f "$counter_file" ]; then
printf '0\n' >"$counter_file"
fi
counter_curr=$(< "$counter_file")
rm /tmp/watchdog.hook
if [ $? -eq 0 ]; then
counter_curr=0
else
(( ++counter_curr ))
if [ "$counter_curr" -eq 3 ]; then
echo "No network connection, restarting wlan0 at $(date)"
/sbin/ifdown 'wlan0'
sleep 5
/sbin/ifup --force 'wlan0'
elif [ "$counter_curr" -ge 5 ]; then
echo "No network connection, rebooting machine at $(date)"
/sbin/shutdown -r now
fi
fi
printf '%s\n' "$counter_curr" >"$counter_file"
Wir möchten 30 Sekunden warten, bevor wir das Skript auf dem Client ausführen, daher fügen wir Folgendes zu cron hinzu:
* * * * * ( sleep 30 ; /path/to/script/watchdog-client.sh )