Alerta de caída de conexión a Internet

9

¿Qué software hay que emitirá una alerta (altavoz de PC) cuando no haya conectividad a Internet durante 5 minutos?

Parece que mi conmutador / enrutador se desconecta cada pocos días y quiero restablecerlo cuando sucede.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
fuente
3
Sin señalar lo obvio, pero está tomando una solución indirecta al problema de un interruptor / enrutador defectuoso
Michael Mrozek

Respuestas:

7

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.

slm
fuente
Por cierto, estoy usando el beepcomando, ¿es seguro para chown /dev/tty0poder usarlo sin él sudo?
Kokizzu
1
@Kokizzu: no, no deberías cambiar la propiedad /dev/tty0.
slm
1
¡Hurra sox! @Kokizzu - El derecho del SLM en dejar los permisos en el /dev/tty0dispositivo independiente, pero se puede obtener una pseudo-terminal de /dev/pts/[num] dispositivo - el mismo tipo de dispositivo de caracteres que xtermusos para cada ventana, por ejemplo - con algo parecido screeno tmuxincluso ssh. Puede controlarlos de manera más segura, ya que de /dev/ptmxtodos modos son solo dispositivos esclavos del dispositivo maestro y no causarán el mismo tipo de problemas que, por ejemplo, /bin/loginpodría causar un proceso propiedad del usuario , que es lo que podría suceder en el otro caso.
mikeserv
aplay alert.waves una forma más estándar de reproducir sonido, ya que es parte del sistema ALSA y viene incluido en la mayoría de las distribuciones.
Ray Foss
4

si está utilizando Linux, puede usar ping dentro de un script para, google.compor ejemplo:

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
fuente
3
Esto funcionará, pero es posible que desee considerar el uso en finglugar de ping. El pingcmd. puede fallar un poco cuando no tiene éxito. El fingcomando por otro lado fallará en 1 segundo. Vea mi A a este Q&A para más información: ¿Cómo redirigir la salida de cualquier comando? . Muestro ambos usando pingy fing.
slm
@slm, gracias por tu edición, estaba confundido sobre cómo hacer que el ping dure solo un segundo
Nidal
Parece que esto ejecutará ping un número ilimitado de veces por segundo si responde de inmediato, como cuando Ethernet pierde energía. sleep 1es suficiente para prevenir esto.
Ray Foss