Ping 随机挂起

Ping 随机挂起

我编写了一个脚本来监控我的互联网连接(如下所示),目的是了解服务何时恢复并为我的 ISP 收集故障排除数据。问题是终端窗口冻结了。我通过添加调试行来追踪对 ping 命令的调用,这些调试行会吐出 echo 命令,这样我就可以跟踪到挂起状态之前的进度。它响应 CTRL+C 让我回到提示符。然后我重新启动 shell 脚本,它工作了一两分钟,然后再次冻结。最多我可以获得大约 5 分钟的执行时间,然后它就会挂起。

我的研究表明,重复使用 ping 时,它会有些不稳定(这不是你对核心实用程序的期望)。我尝试添加-W超时选项,但这似乎只会加速问题的发生(在 10-30 秒内悄无声息地崩溃,而不是 1-5 分钟)。

我的问题是:有没有更好的方法可以解决这个问题?这个脚本是我尝试模拟的(当它没有挂断时效果很好)网络正常运行时间监控器(价格为 10 美元且仅适用于 Windows....嘘!)。

编辑:操作系统是 Xubuntu 16.04.2 LTS(64 位)

#!/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

相关内容