Eu tenho um script que eu coloquei em conjunto para monitorar minha conexão com a internet (fornecida abaixo) com o objetivo de saber quando o serviço é restaurado e acumular dados de solução de problemas para o meu ISP. O problema tem a janela do terminal simplesmente congelar. Eu rastreei as chamadas para o comando ping, adicionando linhas de depuração que cuspiam comandos de eco para que eu pudesse rastrear o progresso até o estado de interrupção. Ele responde a um CTRL + C para me levar de volta ao prompt. Em seguida, reinicio o script de shell e ele funciona por um ou dois minutos e depois congela novamente. Na melhor das hipóteses, posso obter cerca de 5 minutos de tempo de execução antes que ele seja interrompido.
Minha pesquisa aponta para o ping ser um pouco instável (não o que você espera de um utilitário central) quando é usado repetidamente. Eu tentei adicionar a opção -W
timeout, mas isso parece apenas acelerar o problema (falha silenciosamente em 10 a 30 segundos em vez de 1 a 5 minutos).
Minha pergunta é: existe uma maneira melhor de fazer isso? Esse script é minha tentativa (que funciona bem quando não está desligada) para emular o Net Uptime Monitor (que custa US $ 10 e é somente para Windows. ..boo!).
Edit: OS é Xubuntu 16.04.2 LTS (64 bits)
#!/bin/bash
alert="/usr/share/sounds/freedesktop/stereo/network-connectivity-lost.oga"
logfile="netwatch.log"
interval=6
yellow=200
red=1000
function scanGoogle
{
googleStatus=$(ping -c 1 8.8.8.8 | tail -1 | cut -d "/" -f 5 | cut -d '.' -f 1)
if [[ "$googleStatus" == "" ]] ; then googleStatus=0; fi
}
function scanBackbone
{
backboneStatus=$(ping -c 1 4.2.2.2 | tail -1 | cut -d "/" -f 5 | cut -d '.' -f 1)
if [[ "$backboneStatus" == "" ]] ; then backboneStatus=0; fi
}
function scanOpenDNS
{
openDNSStatus=$(ping -c 1 208.67.222.222 | tail -1 | cut -d "/" -f 5 | cut -d '.' -f 1)
if [[ "$openDNSStatus" == "" ]] ; then openDNSStatus=0; fi
}
function display
{
echo -n " ["
if [ "$googleStatus" -eq 0 ]; then
echo -e -n "\e[31m"
googleStatus="N/A"
else
if [ "$googleStatus" -lt "$yellow" ]; then
echo -e -n "\e[1m\e[36m"
googleStatus="$googleStatus ms"
else
if [ "$googleStatus" -lt "$red" ]; then
echo -e -n "\e[1m\e[33m"
googleStatus="$googleStatus ms"
else
echo -e -n "\e[31m"
googleStatus="$googleStatus ms"
fi
fi
fi
echo -e -n "$googleStatus\e[0m : "
if [ "$backboneStatus" -eq 0 ]; then
echo -e -n "\e[31m"
backboneStatus="N/A"
else
if [ "$backboneStatus" -lt "$yellow" ]; then
echo -e -n "\e[1m\e[36m"
backboneStatus="$backboneStatus ms"
else
if [ "$backboneStatus" -lt "$red" ]; then
echo -e -n "\e[1m\e[33m"
backboneStatus="$backboneStatus ms"
else
echo -e -n "\e[31m"
backboneStatus="$backboneStatus ms"
fi
fi
fi
echo -e -n "$backboneStatus\e[0m : "
if [ "$openDNSStatus" -eq 0 ]; then
echo -e -n "\e[31m"
openDNSStatus="N/A"
else
if [ "$openDNSStatus" -lt "$yellow" ]; then
echo -e -n "\e[1m\e[36m"
openDNSStatus="$openDNSStatus ms"
else
if [ "$openDNSStatus" -lt "$red" ]; then
echo -e -n "\e[1m\e[33m"
openDNSStatus="$openDNSStatus ms"
else
echo -e -n "\e[31m"
openDNSStatus="$openDNSStatus ms"
fi
fi
fi
echo -e "$openDNSStatus\e[0m]"
}
function gatherData
{
sleep "$(echo "scale=4; $interval/3" | bc)"
# shellcheck disable=SC2119
scanGoogle > /dev/null 2>&1
sleep "$(echo "scale=4; $interval/3" | bc)"
# shellcheck disable=SC2119
scanBackbone > /dev/null 2>&1
sleep "$(echo "scale=4; $interval/3" | bc)"
# shellcheck disable=SC2119
scanOpenDNS > /dev/null 2>&1
}
function displayOutput
{
clear
echo -n "$(date +'%d/%m/%Y') $(date +'%T'): Internet is "
if [[ $googleStatus -eq 0 ]] || [[ $backboneStatus -eq 0 ]] || [[ $openDNSStatus -eq 0 ]] ; then
if [[ $googleStatus -gt 0 ]] || [[ $backboneStatus -gt 0 ]] || [[ $openDNSStatus -gt 0 ]] ; then
echo -e -n "\e[33mdegraded\e[0m..."
display
else
echo -e "\e[31mDOWN\e[0m!"
echo "$(date +'%d/%m/%Y') $(date +'%T'): Internet is DOWN!!!" >> $logfile
ogg123 $alert > /dev/null 2>&1
fi
else
echo -e -n "\e[32moperational\e[0m."
display
fi
}
function main
{
gatherData
displayOutput
}
echo "$(date +'%d/%m/%Y') $(date +'%T'): Netwatch loading..."
while :
do
main
done