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
.