Puede usar una versión modificada de este script para hacer lo que quiera:
#!/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
Estamos "CONECTADOS" Ejemplo
Con la depuración activada para que pueda ver lo que está haciendo el script.
set -x
Ejecutar con un nombre de host válido para demostrar el estado "la conexión está activa".
$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'
Lo anterior inicializa un par de variables y determina la última vez que fuimos a través del lazo, $lastAccessTime. Ahora intentamos hacer ping a Google.
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
Ahora calculamos cualquier tiempo de inactividad $downTime, si el ping falla, de lo contrario, restablecemos $downTimea cero y volvemos a calcular $lastAccessTime.
+ sleep 15
Ahora esperamos 15 segundos.
+ '[' 0 -ge 300 ']'
Ahora verificamos si hemos estado inactivos durante> 5 minutos (300 segundos). Luego repetimos pasando por el whilebucle.
+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....
Mientras estemos despiertos, no pasará nada más que verificar con el pingcomando cada 15 segundos.
Estamos "DESCONECTADOS" Ejemplo
Ahora para simular una "conexión está inactiva" estado, vamos a intercambiar el nombre de host que estamos ping y el uso de una falsificación uno, google1234567890.com. Repitiendo una ejecución de nuestro script con la depuración habilitada, ahora vemos que se calcula un tiempo de inactividad real.
$ ./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
...
Observe arriba que $downTimees igual a 15 segundos hasta ahora. Si esperamos un poco más, veremos esto:
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15
Hemos acumulado 300 segundos de tiempo de inactividad. Así que ahora cuando comprobamos, imprimimos el mensaje, alert.
+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15
Este estado continuará hasta que se restablezca la conexión y pingvuelva a tener éxito.
¿Y qué hay de un sonido?
Eso es fácil. Puede usar una variedad de herramientas para hacer esto. Usaría algo como soxo mplayerpara reproducir un archivo de audio como un archivo .mp3o .wavcon un sonido apropiado que desea escuchar cada 15 segundos, mientras la conexión está inactiva.
mplayer someaudio.wav
Simplemente reemplace el alertmensaje anterior con esta línea para obtener comentarios de audio de que la conexión está desconectada.
Tiempo de espera de problemas con ping
Si lo usa pingde la manera anterior, es probable que encuentre un tiempo de retraso lento en el que se tarda pingliteralmente entre 10 y 20 segundos en fallar cuando la conexión no funciona. Vea mi respuesta a esta pregunta y respuesta de U&L titulada: ¿Cómo redirigir la salida de cualquier comando? para un ejemplo usando la herramienta de línea de comando en su finglugar. Esta herramienta fallará más rápidamente que la tradicional ping.