Alerta de queda da conexão com a Internet

9

Qual é o software que executará um alerta (alto-falante do PC) quando não houver conectividade com a Internet por 5 minutos?

Meu switch / roteador parece desconectar a cada alguns dias e quero redefini-lo quando isso acontece.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
    
por Kokizzu 09.06.2014 / 00:00

2 respostas

7

Você pode usar uma versão modificada deste script para fazer o que quiser:

#!/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 no exemplo "CONNECTED"

Com a depuração ativada, você pode ver o que o script está fazendo.

set -x

Execução com um nome de host válido para demonstrar o estado "conexão está ativa".

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'

O acima inicializa algumas variáveis e determina a última vez que passamos pelo loop, $lastAccessTime . Agora tentamos fazer o ping no Google.

+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955

Agora calculamos qualquer tempo de inatividade, $downTime , se o ping falhar, caso contrário, redefinimos $downTime para zero e recalculamos $lastAccessTime .

+ sleep 15

Agora esperamos 15 segundos.

+ '[' 0 -ge 300 ']'

Agora, verificamos se estamos perdendo para o > 5 minutos (300 segundos). Então, repetimos passando pelo loop while .

+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....

Enquanto estivermos ativos, nada acontecerá a não ser que verifiquemos com o comando ping a cada 15 segundos.

Estamos no exemplo "DISCONNECTED"

Agora, para simular um estado de "conexão inativa", trocaremos o nome do host que estamos fazendo o ping e usaremos um falso, google1234567890.com . Repetindo uma execução de nosso script com a depuração ativada, agora vemos um tempo de inatividade real sendo calculado.

$ ./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 acima que $downTime é igual a 15 segundos até o momento. Se esperarmos mais um pouco, veremos isso:

+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15

Nós acumulamos 300 segundos de inatividade. Agora, quando verificamos, imprimimos a mensagem alert .

+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15

Esse estado continuará até que a conexão seja restaurada e o ping seja novamente bem-sucedido.

Então, e um som?

Isso é fácil. Você pode usar uma variedade de ferramentas para fazer isso. Eu usaria algo como sox ou mplayer para reproduzir um arquivo de áudio como um arquivo .mp3 ou .wav com um som apropriado que você deseja ouvir a cada 15 segundos, enquanto a conexão está inativa.

mplayer someaudio.wav

Basta substituir a mensagem alert acima por esta linha para obter feedback de áudio informando que a conexão está inativa.

Tempo limite para problemas com ping

Se você usar ping da maneira acima, provavelmente encontrará um atraso lento, em que leva ping literalmente 10-20 segundos para que ele falhe quando a conexão estiver inativa. Veja a minha resposta a este P & D Q & A intitulado: Como redirecionar a saída de qualquer comando? para um exemplo usando a ferramenta de linha de comando fing . Esta ferramenta irá falhar mais rapidamente do que o tradicional ping .

    
por 09.06.2014 / 03:40
4

se você estiver usando o Linux, você pode usar o ping dentro de um script para google.com , por exemplo:

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
    
por 09.06.2014 / 00:46