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 $downTimeinattività, se il ping fallisce, altrimenti ripristiniamo $downTimea 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 whileciclo.
+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....
Finché siamo attivi, non succederà nulla se non controlliamo il pingcomando 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 $downTimefinora è 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 pingsuccesso.
E che dire di un suono?
Questo è facile. È possibile utilizzare una varietà di strumenti per farlo. Vorrei usare qualcosa di simile soxo mplayerper riprodurre un file audio come un file .mp3o .wavcon un suono appropriato che si desidera ascoltare ogni 15 secondi, mentre la connessione non è attiva.
mplayer someaudio.wav
Sostituisci semplicemente il alertmessaggio sopra con questa linea per ottenere un feedback audio che la connessione non è attiva.
Problemi di timeout con ping
Se lo usi pingnel modo sopra, probabilmente ti imbatterai in un ritardo lento in cui occorrono pingletteralmente 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 finginvece lo strumento da riga di comando . Questo strumento fallirà più rapidamente rispetto al tradizionale ping.