Senden Sie einen Netzwerkkonnektivitäts-Ping vom Server an den Client.

Senden Sie einen Netzwerkkonnektivitäts-Ping vom Server an den Client.

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 WLANNetzwerk 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 ssheine 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 )

verwandte Informationen