Starten Sie den Computer neu, wenn die Internetverbindung unterbrochen wird


4

Ich versuche ein kleines Bash-Skript zu schreiben, das die Internetverbindung überprüft. Wenn kein Internet erkannt wird, wird es in weiteren 10 Minuten erneut versucht. Wenn immer noch kein Internet vorhanden ist, wird der Computer neu gestartet. Ich habe dies bisher geschrieben. Vorschläge zur Verbesserung / Effizienz / Verbesserung des Codes sind willkommen.

#!/bin/bash
# Script to restart the computer if there is no internet connection 
#   within the next 10 minutes of whenever the script is run, which 
#   I'll setup via crontab to run every half an hour. 

IS=`/bin/ping -c 5 8.8.8.8 | grep -c "64 bytes"`        

if (test "$IS" -gt "2") then                                
        internet_conn="1"
    exit
else
    internet_conn="0"
    sleep 600

    AA=`/bin/ping -c 5 74.125.226.18 | grep -c "64 bytes"`

    if (test "$AA" -gt "2") then                                
        internet_conn="1"
        exit
    else
        sudo shutdown -r now
    fi
fi

3
Nur neugierig: Was nützt ein Neustart, wenn Ihr Link ausfällt? Was wird Ihrer Meinung nach passieren, wenn Google diese IP-Adresse entfernt / recycelt und ICMP nicht mehr zurückgibt? Wenn du das trotzdem machen willst, solltest du besser diese IP wählen: 8.8.8.8 (google public dns server)
Shadok

1
Dieser Computer initiiert mithilfe eines Skripts einen umgekehrten SSH-Tunnel. Aufgrund von Netzwerkproblemen sind die Sockets manchmal abgestanden und aktive Verbindungen durch den Tunnel hängen, sodass ein Neustart alles neu startet. Gemäß Ihrem Vorschlag habe ich die IP geändert. Guter Fang.
Sparctus

Ich sehe keine echte Antwort auf eine Frage. Vielleicht sollte diese auf die Website zum Austausch von Code Review-Stapeln verschoben werden .
Caspar

Ohh, ich wusste nicht, dass eine solche Seite existiert. Sollte dann wohl umgezogen sein.
Sparctus

Antworten:


2

Ich denke, Ihr Skript sollte funktionieren, aber Sie möchten möglicherweise mehr Stellen als nur einen DNS-Server überprüfen. Zugegeben, es ist ein großer DNS, der wahrscheinlich nie ausfällt, aber Sie möchten Ihren Server nicht neu starten, wenn er gerade Wartungsarbeiten an dieser IP durchführt, also würde ich vielleicht drei Quellen prüfen und wenn alle als ausgefallen erscheinen, starten Sie Ihren Server neu Server.

Wäre es auch klüger, die Benutzeroberfläche einfach herunterzufahren und zu sichern, als einen Neustart durchzuführen?


1

Kleiner Vorschlag, Sie brauchen grep nicht, um zu bewerten, ob der Ping erfolgreich war. Ping wird bei Erfolg mit 0 und bei Auftreten eines Fehlers mit 1 oder höher beendet. Sie können es also auch folgendermaßen skripten. Die $? Variable zeigt den Rückkehrcode des zuletzt ausgeführten Befehls.

/bin/ping -c 5 8.8.8.8

if ( $? -ge 1); then
 ......
fi

0

Hier ist ein Ansatz, der verwendet wird at, um sich in 10 Minuten neu zu terminieren und erneut zu überprüfen.

#!/bin/bash
count=${1:-1}
if /bin/ping -c 5 8.8.8.8 2>&/dev/null; then                                
    if [ $count -eq 2 ]; then
        sudo shutdown -r now
    else
        at now + 10 minutes <<< "$0 $((count + 1))"
    fi
fi

Vielen Dank. Ich habe ein bisschen Verständnisschwierigkeiten. Zum Beispiel: count = $ {1: -1} Ist dies so etwas wie eine Variable, die einer anderen Variablen zugewiesen ist?
Sparctus

Die :-Syntax setzt die Variable ( $1) auf den Standardwert ("1"), wenn $ 1 leer (Benutzer hat das Argument übergeben "") oder nicht gesetzt (Benutzer hat keine Argumente angegeben) ist.
Glenn Jackman

0

Ihr Kommentar zum "Stalling" eines Reverse-SSH-Tunnels nach einer Weile ist wahrscheinlich darauf zurückzuführen, dass ein NAT-Router versucht, die Tabelle der offenen Verbindungen zu minimieren, und sollte mithilfe der Anweisung "ServerAliveInterval" behoben werden, wie in den OpenSSH-FAQ erläutert .

In einigen Fällen schränkt der Router / die Firewall Ihre Sitzungen ohnehin aggressiv ein (schlecht!), Wenn die Verbindung für längere Zeit nicht genutzt wird, wodurch Sie gezwungen werden, das ServerAliveInterval zu verringern (siehe Hinweis ).

Der Trick in diesem Fall besteht darin, eine Art Wrapper zu verwenden, der den ssh-Daemon überwacht und bei Bedarf neu startet. Autossh erledigt genau das, um Ihr Problem sofort zu lösen!


Hinweis : Dies ist etwas, das Sie einschränken möchten, da eine Erhöhung der Häufigkeit von Keepalive-Paketen auf einer instabilen Verbindung das Risiko von Unterbrechungen erhöht. Die als x Keepalive-Antwortpakete definierten TCP-ACK-Pakete sind in Wirklichkeit nacheinander fehlgeschlagen.

Wenn Ihr Link zuverlässig ist, können Sie diese Direktive nach Belieben reduzieren (Vorsicht, Sie benötigen kein Keepalive-Paket pro Sekunde), um eine schnellere Trennung vom Server zu erkennen.


PS: Um meinen Kommentar zu der Frage zu erläutern, ich bin ein bisschen abgestoßen von der Idee, Ping als Bedingung für den Neustart eines Dienstes zu verwenden und ihn auf einem Server zu verwenden, den Sie nicht besitzen und der daher möglicherweise nicht für die Verfügbarkeit garantieren kann Morgen wird Google entscheiden, nicht mehr auf Echo-Pings zu reagieren, und Ihr Server wird auf unbestimmte Zeit neu gestartet.

Ein weiteres Problem ist, was Sie als "Internetverbindung" definieren, per Definition eine große Sammlung von Netzwerken, und das Testen eines einzelnen Endpunkts kann zu klein sein, um eine Vorstellung von Ihrer Konnektivität im Netzwerk zu bekommen. Aus diesem Grund werden bei Überwachungsdiensten im Web verschiedene Methoden verwendet von Links zum Verfolgen der Antwortzeit / -verfügbarkeit / etc ...


0

Diese Antwort gilt für diejenigen, die im Jahr 2019 oder später kommen:

Ich habe versucht, die Antwort von @rkokkelk zu verwenden, aber es scheint nicht zu funktionieren, und die Bash-Dokumentation bestätigt diese Annahme, wenn ich richtig lese.

Deshalb präsentiere ich Ihnen meine persönliche Herangehensweise (ich weiß, dass es nicht effizient ist, aber ich wollte es so):

#!/bin/bash
# Restarts computer after 90 minutes of no internet connection.

/bin/ping -c 20 8.8.8.8

if [ "$(echo $?)" == 1 ]; then
    sleep 15
    /bin/ping -c 20 8.8.4.4

    if [ "$(echo $?)" == 1 ]; then
        sleep 5400

        /bin/ping -c 20 8.8.8.8

        if [ "$(echo $?)" == 1 ]; then
            sleep 15
            /bin/ping -c 20 8.8.4.4

            if [ "$(echo $?)" == 1 ]; then
                shutdown -r now
            else
                exit
            fi
        else
            exit
        fi
    else
        exit
    fi

else
    exit
fi

Das funktioniert mit bash version 4.4.12(1)-release.


Es gibt keinen Grund zu sagen "$(echo $?)"; sag einfach "$?". (Und genau genommen, wenn Sie nachhallen wollen $?, sollten Sie echo "$?".)
Scott

@Scott Es hat nicht so funktioniert, wie Sie echoes vorgeschlagen haben.
Akito
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.