Alerta de queda de conexão com a Internet

9

Que software existe para reproduzir um alerta (alto-falante do PC) quando não há conectividade à Internet por 5 minutos?

Meu switch / roteador parece desconectar-se a cada poucos dias e desejo redefini-lo quando isso acontecer.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
fonte
3
Não apontar o óbvio, mas você está tomando uma solução muito rotunda para o problema de um interruptor defeituoso / router
Michael Mrozek

Respostas:

7

Você pode usar uma versão modificada desse script para fazer o que deseja:

#!/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" Exemplo

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

set -x

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

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

O exemplo acima inicializa algumas variáveis ​​e determina a última vez que passamos pelo loop $lastAccessTime,. Agora tentamos executar 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 $downTimepara zero e recalculamos $lastAccessTime.

+ sleep 15

Agora esperamos 15 segundos.

+ '[' 0 -ge 300 ']'

Agora, verificamos se estamos inativos por> 5 minutos (300 segundos). Depois, repetimos o processo while.

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

Enquanto estivermos acordados, nada acontecerá além de verificarmos o pingcomando a cada 15 segundos.

Exemplo "DESCONECTADO"

Agora, para simular um estado de "conexão inativa", trocaremos o nome do host que estamos executando o ping e usaremos um falso google1234567890.com. Repetindo uma execução do nosso script com a depuração ativada, agora vemos algum 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é agora. Se esperarmos um pouco mais, veremos o seguinte:

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

Acumulamos 300 segundos de tempo de inatividade. Então 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 pingtenha êxito novamente.

Então, que tal um som?

Isso é fácil. Você pode usar uma variedade de ferramentas para fazer isso. Eu usaria algo parecido soxou mplayerreproduzir um arquivo de áudio, como um .mp3ou .wavarquivo com um som apropriado que você quer ouvir a cada 15 segundos, enquanto a conexão é baixo.

mplayer someaudio.wav

Simplesmente substitua a alertmensagem acima por esta linha para obter feedback de áudio de que a conexão está inoperante.

Tempo limite de problemas com ping

Se você usar pingda maneira acima, provavelmente encontrará um tempo de atraso lento, onde leva pingliteralmente de 10 a 20 segundos para que falhe quando a conexão estiver inoperante. Veja minha resposta a esta sessão de perguntas e respostas da U&L intitulada: Como redirecionar a saída de qualquer comando? por exemplo, usando a ferramenta de linha de comando fing. Essa ferramenta falhará mais rapidamente do que a tradicional ping.

slm
fonte
Btw eu estou usando o beepcomando, é seguro para chown /dev/tty0que eu pudesse usá-lo sem sudo?
Kokizzu
1
@Kokizzu - não, você não deve mudar de propriedade /dev/tty0.
slm
1
Viva sox! @Kokizzu - direito do SLM sobre deixar as permissões no /dev/tty0dispositivo sozinho, mas você pode obter um pseudo-terminal /dev/pts/[num] dispositivo - o mesmo tipo de dispositivo de caractere que xtermusos para cada janela, por exemplo - com algo como screenou tmuxou mesmo ssh. Você pode controlar com mais segurança, pois eles são apenas dispositivos escravos para o /dev/ptmxdispositivo mestre de qualquer maneira e não causam o mesmo tipo de problemas que, digamos, um /bin/loginprocesso de propriedade do usuário poderia - o que poderia acontecer no outro caso.
mikeserv
aplay alert.wavé uma maneira mais padrão de reproduzir som, pois faz parte do sistema ALSA e vem pré-agrupado na maioria das distribuições.
Ray Foss
4

Se você estiver usando Linux, poderá usar ping em um script para, google.compor 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
Nidal
fonte
3
Isso funcionará, mas você pode considerar o uso em fingvez de ping. O pingcmd. pode demorar um pouco para falhar quando não for bem-sucedido. Por fingoutro lado, o comando falhará dentro de 1 segundo. Veja meu A para estas perguntas e respostas para obter mais informações: Como redirecionar a saída de qualquer comando? . Eu mostro ambos usando pinge fing.
slm
@slm, Obrigado pela sua edição, eu estava confuso como fazer pingue duram apenas por um segundo
Nidal
Parece que isso executará o ping um número ilimitado de vezes por segundo se responder imediatamente, como quando a Ethernet perde energia. sleep 1é suficiente para evitar isso.
Ray Foss