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 $downTime
do 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 while
pę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 ping
polecenie 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 $downTime
do 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 ping
ponownego 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 sox
lub mplayer
odtworzyć plik audio taki jak .mp3
lub .wav
plik 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 alert
powyż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 ping
powyższego sposobu, najprawdopodobniej napotkasz powolne opóźnienie, w którym ping
dosł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
.