我编写了一个脚本来监控我的互联网连接(如下所示),目的是了解服务何时恢复并为我的 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