Alarm zum Unterbrechen der Internetverbindung

9

Welche Software gibt eine Warnung aus (PC-Lautsprecher), wenn 5 Minuten lang keine Internetverbindung besteht?

Mein Switch / Router scheint sich alle paar Tage zu trennen, und ich möchte ihn zurücksetzen, wenn es passiert.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
quelle
3
Um nicht auf das Offensichtliche hinzuweisen, aber Sie nehmen eine sehr umständliche Lösung für das Problem eines fehlerhaften Switches / Routers
Michael Mrozek

Antworten:

7

Sie können eine geänderte Version dieses Skripts verwenden, um das zu tun, was Sie möchten:

#!/bin/bash

downTime=0
lastAccessTime=$(date +"%s")
while [ true ]; do
if ! ping -c1 google.com >& /dev/null; then
    downTime=$(( $(date +"%s") - $lastAccessTime ))
else
    downTime=0
    lastAccessTime=$(date +"%s")
fi

sleep 15

if [ $downTime -ge 300 ]; then
   echo "alert"
fi
done

Wir sind "VERBUNDEN" Beispiel

Wenn das Debuggen aktiviert ist, können Sie sehen, was das Skript tut.

set -x

Wird mit einem gültigen Hostnamen ausgeführt, um den Status "Verbindung ist aktiv" zu demonstrieren.

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'

Das Obige initialisiert einige Variablen und bestimmt, wann wir das letzte Mal die Schleife durchlaufen haben $lastAccessTime. Wir versuchen jetzt, Google zu pingen.

+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955

Wir berechnen jetzt jede Ausfallzeit $downTime. Wenn der Ping fehlschlägt, setzen wir ihn $downTimeauf Null zurück und berechnen ihn neu $lastAccessTime.

+ sleep 15

Jetzt warten wir 15 Sekunden.

+ '[' 0 -ge 300 ']'

Jetzt prüfen wir, ob wir länger als 5 Minuten (300 Sekunden) unten waren. Dann wiederholen wir das Durchlaufen der whileSchleife.

+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....

Solange wir auf sind, passiert nichts anderes, als dass wir pingalle 15 Sekunden mit dem Befehl nachsehen.

Wir sind "DISCONNECTED" Beispiel

Um nun zu simulieren, dass die Verbindung unterbrochen ist, tauschen wir den Hostnamen, den wir pingen, aus und verwenden einen gefälschten google1234567890.com. Wenn wir einen Lauf unseres Skripts mit aktiviertem Debugging wiederholen, wird nun eine tatsächliche Ausfallzeit berechnet.

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402277506
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=0
+ sleep 15
+ '[' 0 -ge 300 ']'
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=15
+ sleep 15
...

Beachten Sie, dass $downTimedies bisher 15 Sekunden entspricht. Wenn wir länger warten, sehen wir Folgendes:

+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15

Wir haben 300 Sekunden Ausfallzeit. Wenn wir dies überprüfen, drucken wir die Nachricht aus alert.

+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15

Dieser Status wird fortgesetzt, bis die Verbindung wiederhergestellt ist und die Verbindung pingerneut erfolgreich ist.

Was ist also mit einem Sound?

Das ist einfach. Sie können dazu eine Vielzahl von Tools verwenden. Ich würde so etwas wie soxoder verwenden mplayer, um eine Audiodatei wie eine .mp3oder eine .wavDatei mit einem geeigneten Ton abzuspielen, den Sie alle 15 Sekunden hören möchten, während die Verbindung unterbrochen ist.

mplayer someaudio.wav

Ersetzen Sie einfach die alertobige Meldung durch diese Zeile, um Audio-Feedback zu erhalten, dass die Verbindung unterbrochen ist.

Zeitüberschreitung bei Problemen mit Ping

Wenn Sie pingdie oben beschriebene Methode verwenden, tritt wahrscheinlich eine langsame Verzögerungszeit auf, bei der es pingbuchstäblich 10 bis 20 Sekunden dauert , bis sie fehlschlägt, wenn die Verbindung unterbrochen wird. Siehe meine Antwort auf diese U & L-Fragen und Antworten mit dem Titel: Wie leite ich die Ausgabe eines Befehls um? Beispiel: Verwenden Sie fingstattdessen das Befehlszeilenprogramm . Dieses Tool schlägt schneller fehl als das herkömmliche ping.

slm
quelle
Übrigens, ich benutze den beepBefehl, ist es sicher, chown /dev/tty0damit ich ihn ohne benutzen kann sudo?
Kokizzu
1
@ Kokizzu - nein, du solltest den Besitzer nicht wechseln /dev/tty0.
slm
1
Hurra sox! @Kokizzu - slm hat Recht, die Berechtigungen auf dem /dev/tty0Gerät in Ruhe zu lassen, aber Sie könnten ein Pseudo-Terminal- /dev/pts/[num] Gerät - dieselbe Art von Zeichengerät, xtermdas zum Beispiel für jedes Fenster verwendet wird - mit etwas wie screenoder tmuxoder sogar erhalten ssh. Diese können Sie sicherer steuern, da sie /dev/ptmxohnehin nur Slave-Geräte für das Master- Gerät sind und nicht die gleichen Probleme verursachen wie beispielsweise ein benutzereigener /bin/loginProzess - was im anderen Fall passieren könnte.
Mikesserv
aplay alert.wavist eine Standardmethode zum Abspielen von Sound, da sie Teil des ALSA-Systems ist und in den meisten Distributionen vorbündelt ist.
Ray Foss
4

Wenn Sie Linux verwenden, können Sie Ping in einem Skript verwenden, google.comum beispielsweise:

counter=0
while [ true ]
do
ping -c 1 google.com > /dev/null 2>&1
if [ $? -ne 0 ] 
then
    let "counter +=1"
else
    let "counter = 0"
fi
if [ $counter -eq 300 ] # we assume that one ping need one second (300 is 5 minutes)
then
   echo "alert"
fi
done
Nidal
quelle
3
Dies wird funktionieren, aber Sie können auch die Verwendung von finganstelle von in Betracht ziehen ping. Der pingcmd. Es kann ein bisschen dauern, bis es fehlschlägt, wenn es nicht erfolgreich ist. Der fingBefehl schlägt dagegen innerhalb von 1 Sekunde fehl. Weitere Informationen finden Sie in meinem A zu diesen Fragen und Antworten: Wie leite ich die Ausgabe eines Befehls um? . Ich zeige sowohl mit pingals auch fing.
slm
@slm, danke für Ihre Bearbeitung, ich war verwirrt, wie man Ping nur für eine Sekunde dauern lässt
Nidal
Es scheint, dass dies Ping unbegrenzt oft pro Sekunde ausführt, wenn es sofort reagiert, z. B. wenn das Ethernet die Stromversorgung verliert. sleep 1ist genug, um dies zu verhindern.
Ray Foss