Puoi usare una versione modificata di questo script per fare quello che vuoi:
#!/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
Siamo un esempio di "CONNESSO"
Con il debug attivato in modo da poter vedere cosa sta facendo lo script.
set -x
In esecuzione con un nome host valido per dimostrare lo stato "connessione in corso".
$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'
Quanto sopra inizializza un paio di variabili e determina l'ultima volta che siamo andati attraverso il ciclo, $lastAccessTime
. Ora proviamo a eseguire il ping di Google.
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
Ora calcoliamo i tempi di $downTime
inattività, se il ping fallisce, altrimenti ripristiniamo $downTime
a zero e ricalcoliamo $lastAccessTime
.
+ sleep 15
Ora aspettiamo 15 secondi.
+ '[' 0 -ge 300 ']'
Ora controlliamo se siamo rimasti inattivi per> 5 minuti (300 secondi). Quindi ripetiamo di passare attraverso il while
ciclo.
+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....
Finché siamo attivi, non succederà nulla se non controlliamo il ping
comando ogni 15 secondi.
Siamo "DISCONNECTED" Esempio
Ora per simulare una "connessione è giù" stato, faremo scambiare l'hostname stiamo pinging e utilizzare un falso uno, google1234567890.com
. Ripetendo un'esecuzione del nostro script con il debug abilitato, ora vediamo calcolare alcuni tempi di inattività effettivi.
$ ./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
...
Si noti che $downTime
finora è pari a 15 secondi. Se aspettiamo ancora un po 'vedremo questo:
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15
Abbiamo accumulato 300 secondi di inattività. Così ora quando controlliamo il risultato della stampa il messaggio, alert
.
+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15
Questo stato continuerà fino al ripristino della connessione e al ping
successo.
E che dire di un suono?
Questo è facile. È possibile utilizzare una varietà di strumenti per farlo. Vorrei usare qualcosa di simile sox
o mplayer
per riprodurre un file audio come un file .mp3
o .wav
con un suono appropriato che si desidera ascoltare ogni 15 secondi, mentre la connessione non è attiva.
mplayer someaudio.wav
Sostituisci semplicemente il alert
messaggio sopra con questa linea per ottenere un feedback audio che la connessione non è attiva.
Problemi di timeout con ping
Se lo usi ping
nel modo sopra, probabilmente ti imbatterai in un ritardo lento in cui occorrono ping
letteralmente 10-20 secondi perché fallisca quando la connessione è inattiva. Vedi la mia risposta a queste domande e risposte U&L intitolata: Come reindirizzare l'output di qualsiasi comando? ad esempio usando fing
invece lo strumento da riga di comando . Questo strumento fallirà più rapidamente rispetto al tradizionale ping
.