O ping está pendurado aleatoriamente

1

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
    
por Aaron Nichols 01.08.2017 / 00:51

0 respostas