Ping случайным образом зависает

У меня есть сценарий, который я соединил для контроля моего интернет-соединения (обеспеченный ниже) в целях знать, когда сервис восстанавливается и накапливающий поиск и устранение неисправностей данных для моего ISP. Проблема имеет окно терминала, просто замораживаются. Я проследил его до вызовов к команде ping путем добавления строк отладки, которые выкладывают команды эха, таким образом, я мог проследить прогресс вплоть до подвешивать состояния. Это отвечает на CTRL+C для возвращения меня к подсказке. Я затем перезапускаю сценарий оболочки, и он работает в течение, возможно, минуты или два затем замораживания снова. В лучшем случае я могу получить приблизительно 5 минут времени выполнения, прежде чем это зависнет.

Мое исследование указывает для проверки с помощью ping-запросов быть несколько нестабильным (не, что Вы ожидаете из базовой утилиты), когда оно будет неоднократно использоваться. Я пытался добавить -W опция тайм-аута, но который только, кажется, ускоряет проблему (отказывающий тихо за 10-30 секунд вместо 1-5 минут).

Мой вопрос: существует ли лучший способ пойти об этом? Этот сценарий является моей попыткой (который работает хорошо, когда это не зависается) для эмуляции Сетевого Монитора Времени работы (который, 10$, и только для Windows.... шикают!).

Править: ОС является Xubuntu 16.04.2 (64-разрядные) LTS

#!/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
1
задан 1 August 2017 в 04:07

0 ответов

Другие вопросы по тегам:

Похожие вопросы: