监控互联网连接稳定性的脚本

监控互联网连接稳定性的脚本

我希望每次我的路由器失去互联网连接时都能报告。

我希望每次路由器的系统日志显示消息“以太网链路断开”时,我的 Ubuntu 系统都会向我发送一封电子邮件。

有可能吗?我认为我必须写一个脚本,对吗?

答案1

我知道这是一个老问题,但我发现它正在寻找解决方案,所以我最终写了一个。这是一个 shell 脚本,用于检查互联网连接,并记录任何中断以及重新连接的链接速度。请随意获取它:

https://github.com/TristanBrotherton/netcheck

答案2

你可以在 cron 作业中尝试类似的事情

#!/bin/bash
dt=$(date +%Y%m%d_%H%M%S)
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
    echo "$dt:Online"
else
    echo "$dt:Offline"
    mail -s "Internet connection lost on $(hostname) at $(date)" 
fi

我个人有一个脚本,用于存储连接质量报告(取决于你可以从中获得的 speedtest 包apt-get install speedtest-cli

#!/bin/bash
#***************************************
# FOR CRONTAB
# */10 * * * * /location/of/my-internet-test.sh
#***************************************
LOG_FILE="/var/log/internet_test_$(hostname).csv"
mkdir -p $(dirname $LOG_FILE)
DT=$(date '+%Y-%m-%dT%H:%M:%S')
SPEED_TEST_RES=$(speedtest-cli --simple 2>/dev/null)
#set -o xtrace
DL=$(echo $SPEED_TEST_RES | awk '{print $5}')
UL=$(echo $SPEED_TEST_RES | awk '{print $8}')
PING=$(echo $SPEED_TEST_RES | awk '{print $2}')
#set -x
#echo "Ping: '$PING' DL:'${DL}' UL:'${UL}'"
[[ -z "$DL" ]] && { DL=0; UL=0; PING=0; }
echo "$DT,$PING,$DL,$UL" >> $LOG_FILE

请注意,这是一个更好的做法从 cron 定期调用脚本而不是循环

答案3

自从引入该ip命令以来,您可以使用该ip monitor命令执行某些操作。尝试执行如下操作:

#!/bin/bash
shopt -s extglob
ip -ts monitor neigh | while read event; do
    case "$event" in
      *router*FAILED*) POST_NOTIFICATION_OF_ROUTER_DOWN ;;
esac
done

ip monitor neigh监视邻近主机的状态。路由器既是邻居,又是路由器。

当路由器发生故障时,监视器会发送如下消息:

[2020-04-19T07:22:59.322335] fe80::1256:3456:ffff:1212 dev ethusb1  router FAILED

当路由器启动时,消息如下:

[2020-04-19T07:30:15.291261]fe80::1256:3456:ffff:1212  dev ethusb1 lladdr 10:56:11:7e:42:49 router REACHABLE

启用shopt -s extglob高级 bash 解析。

-ts是短时间戳格式。从功能上来说,这不是必需的,但我发现在记录输出时很有用。

要监控所有 IP 对象,请尝试ip -ts monitor all

答案4

因为包含代码片段的评论很难作为有效语法反馈到文件中,所以我将其作为答案发布在这里。这基本上就是我所寻找的,找到互联网连接中断的次数。

#!/bin/bash

while true; do
    wget -q --tries=5 --timeout=20 -O - http://www.google.com > /dev/null

    if [[ $? -eq 0 ]]; then :
        else echo $(date) "offline" | tee -a $HOME/offline.csv
    fi

    sleep 5
done

另一个很好的答案,发现https://stackoverflow.com/a/14939373/7546562,显示此脚本。我已对其进行了修改以满足您的需求,但请注意,它可能不适用于所有操作系统发行版。

#!/bin/bash

while true; do
    # Test for network conection
    for interface in $(ls /sys/class/net/ | grep -v lo)
    do if [[ $(cat /sys/class/net/$interface/carrier) = 1 ]]; then OnLine=1; fi; done
    if ! [ $OnLine ]; then echo $(date) "offline" | tee -a $HOME/offline.csv; fi

    sleep 10
done

最后,如果你愿意,可以添加以下内容sudo nano /etc/rc.local

su - YOUR_USER -c "bash /home/pi/Scripts/net2.sh" &
su - YOUR_USER -c "bash /home/pi/Scripts/net3.sh" &

相关内容