Alert o zerwaniu połączenia internetowego

9

Jakie oprogramowanie wyświetla alert (głośnik komputera), gdy przez 5 minut nie ma połączenia z Internetem?

Mój przełącznik / router wydaje się rozłączać co kilka dni i chcę go zresetować, kiedy to nastąpi.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
źródło
3
Nie wspominając o oczywistości, ale podejmujesz bardzo okrągłe rozwiązanie problemu wadliwego przełącznika / routera
Michael Mrozek

Odpowiedzi:

7

Możesz użyć zmodyfikowanej wersji tego skryptu, aby zrobić to, co chcesz:

#!/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

Przykład „POŁĄCZONY”

Po włączeniu debugowania możesz zobaczyć, co robi skrypt.

set -x

Uruchamianie z prawidłową nazwą hosta w celu wykazania stanu „połączenie jest aktywne”.

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

Powyższy inicjuje kilka zmiennych i określa ostatni raz przeszedł pętli $lastAccessTime. Teraz próbujemy pingować Google.

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

Teraz obliczamy czas przestoju $downTime, jeśli ping się nie powiedzie, w przeciwnym razie resetujemy $downTimedo zera i ponownie obliczamy $lastAccessTime.

+ sleep 15

Teraz czekamy 15 sekund.

+ '[' 0 -ge 300 ']'

Teraz sprawdzamy, czy byliśmy nieobecni przez> 5 minut (300 sekund). Następnie powtarzamy przejście przez whilepętlę.

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

Dopóki nie wstaniemy, nic się nie wydarzy, poza tym, że sprawdzamy pingpolecenie co 15 sekund.

Przykład „ODŁĄCZONY”

Teraz, aby symulować „połączenie jest w dół” stan, będziemy zamieniać nazwę hosta jesteśmy pingowanie i używać fałszywy, google1234567890.com. Po ponownym uruchomieniu naszego skryptu z włączonym debugowaniem widzimy teraz obliczanie faktycznego czasu przestoju.

$ ./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
...

Zauważ, że $downTimedo tej pory było to 15 sekund. Jeśli poczekamy jeszcze chwilę, zobaczymy:

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

Naliczyliśmy 300 sekund przestoju. Więc teraz, kiedy sprawdzić, możemy wydrukować wiadomość alert.

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

Ten stan będzie trwał do momentu przywrócenia połączenia i pingponownego nawiązania połączenia .

A co z dźwiękiem?

To łatwe. Aby to zrobić, możesz użyć różnych narzędzi. Chciałbym użyć czegoś takiego jak soxlub mplayerodtworzyć plik audio taki jak .mp3lub .wavplik z odpowiednim dźwiękiem, który chcesz usłyszeć co 15 sekund, gdy połączenie jest nieczynne.

mplayer someaudio.wav

Po prostu zastąp alertpowyższy komunikat tym wierszem, aby uzyskać informację audio, że połączenie nie działa.

Przekroczono limit czasu problemów z pingiem

Jeśli użyjesz pingpowyższego sposobu, najprawdopodobniej napotkasz powolne opóźnienie, w którym pingdosłownie 10-20 sekund zawiedzie, gdy połączenie zostanie przerwane. Zobacz moją odpowiedź na pytania i odpowiedzi dotyczące U&L zatytułowane: Jak przekierować wyjście dowolnego polecenia? na przykład za pomocą narzędzia wiersza poleceń fing. To narzędzie zawiedzie szybciej niż tradycyjne ping.

slm
źródło
Przy okazji używam beeppolecenia, czy jest to bezpieczne, aby chown /dev/tty0móc go używać bez sudo?
Kokizzu,
1
@Kokizzu - nie, nie powinieneś zmieniać właściciela /dev/tty0.
slm
1
Brawo sox! @Kokizzu - tuż za SLM o opuszczeniu uprawnienia na /dev/tty0urządzenia samodzielnie, ale można dostać pseudo-terminal /dev/pts/[num] urządzenie - ten sam rodzaj urządzenia znakowego, który xtermzastosowań dla każdego okna, na przykład - z czymś takim screenlub tmuxczy nawet ssh. Można je bezpieczniej kontrolować, ponieważ i tak są to tylko urządzenia podrzędne do /dev/ptmxurządzenia nadrzędnego i nie będą powodować tego samego rodzaju problemów, co powiedzmy, że /bin/loginproces należący do użytkownika może - co dzieje się w innym przypadku.
mikeserv
aplay alert.wavjest bardziej standardowym sposobem odtwarzania dźwięku, ponieważ jest częścią systemu ALSA i jest dostępny w większości dystrybucji.
Ray Foss,
4

jeśli używasz Linuksa, możesz użyć polecenia ping w skrypcie, aby google.comna przykład:

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
źródło
3
To zadziała, ale możesz rozważyć użycie fingzamiast ping. pingCmd. może trochę potrwać, jeśli się nie powiedzie. Z fingdrugiej strony polecenie zakończy się niepowodzeniem w ciągu 1 sekundy. Zobacz moje A do tego pytania i odpowiedzi, aby dowiedzieć się więcej: Jak przekierować wyjście dowolnego polecenia? . Pokazuję zarówno za pomocą, jak pingi fing.
slm
@slm, Dzięki za edycję, byłem zdezorientowany, jak sprawić, by ping trwał tylko przez jedną sekundę
Nidal
Wygląda na to, że wykona polecenie ping nieograniczoną liczbę razy na sekundę, jeśli zareaguje natychmiast, na przykład w przypadku utraty zasilania sieci Ethernet. sleep 1wystarczy, aby temu zapobiec.
Ray Foss,