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 $downTime
para 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 ping
comando 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 ping
tenha ê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 sox
ou mplayer
reproduzir um arquivo de áudio, como um .mp3
ou .wav
arquivo com um som apropriado que você quer ouvir a cada 15 segundos, enquanto a conexão é baixo.
mplayer someaudio.wav
Simplesmente substitua a alert
mensagem 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 ping
da maneira acima, provavelmente encontrará um tempo de atraso lento, onde leva ping
literalmente 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
.