实现原理

定时ping两个外网IP,如果连续N次都ping不通,则用 ifup wan 重启网卡重新拨号

文件及目录

ping检测脚本:/root/ping/ping.sh
守护脚本:/root/ping/daemon.sh 判断ping检测脚本是否有在运行,没有则启动,添加到计划任务定时启动即可
日志:/root/ping/log.txt

ping检测脚本

/root/ping/ping.sh
其中 sshpass -p xxxxx ssh -p 22 root@192.168.2.10 'reboot' 是ssh通知esxi进行软路由重启,xxxxx是密码

#!/bin/sh

#ping 的总次数
PING_SUM=3

#ping 的间隔时间,单位秒
SLEEP_SEC=10

#连续重启网卡 REBOOT_CNT 次网络都没有恢复正常,重启软路由
#时间= (SLEEP_SEC * PING_SUM + 20) * REBOOT_CNT
REBOOT_CNT=30

LOG_PATH="/root/ping/log.txt"

cnt=0
reboot_cnt=0
while :
do
    ping -c 1 -W 1 114.114.114.114 > /dev/null
    ret=$?
    
    ping -c 1 -W 1 223.6.6.6 > /dev/null
    ret2=$?
    
    if [[ $ret -eq 0 || $ret2 -eq 0 ]]
    then
        echo 'Network OK!'
        cnt=0
        reboot_cnt=0
    else
        cnt=`expr $cnt + 1`
        echo -n `date '+%Y-%m-%d %H:%M:%S'` >> $LOG_PATH
        printf '-> [%d/%d] Network maybe disconnected,checking again after %d seconds!\r\n' $cnt $PING_SUM $SLEEP_SEC >> $LOG_PATH
        printf '-> [%d/%d] Network maybe disconnected,checking again after %d seconds!\r\n' $cnt $PING_SUM $SLEEP_SEC 
        
        if [ $cnt == $PING_SUM ]
        then
            echo 'ifup wan!!!' >> $LOG_PATH
            echo 'ifup wan!!!'
            
            ifdown wan
            sleep 1
            ifup wan
            
            cnt=0
            #重连后,等待20秒再进行ping检测
            sleep 20
            
            
            #网卡重启超过指定次数还没恢复正常,重启软路由
            reboot_cnt=`expr $reboot_cnt + 1`
            if [ $reboot_cnt == $REBOOT_CNT ]
            then
                echo -n `date '+%Y-%m-%d %H:%M:%S'` >> $LOG_PATH
                echo '-> =============== reboot!' >> $LOG_PATH
                echo '-> =============== reboot!'
                
                sshpass -p xxxxx ssh -p 22 root@192.168.2.10 'reboot'  
            fi
        fi
    fi
    
    sleep $SLEEP_SEC
done



守护脚本

/root/ping/daemon.sh

#!/bin/sh

LOG_PATH="/root/ping/log.txt"

# 用ps获取ups进程数量
NUM=`ps | grep ping.sh | grep -v grep | wc -l`
echo ${NUM}

# 少于1,重启进程
if [ "${NUM}" -lt "1" ]
then
    /root/ping/ping.sh > /dev/null &
    echo -n `date '+%Y-%m-%d %H:%M:%S'` >> $LOG_PATH
    echo '-> Ping daemon start' >> $LOG_PATH
fi
exit 0


计划任务定时执行守护脚本

编辑文件 /var/spool/cron/crontabs/root 在最后边添加一行

*/1 * * * * /root/ping/daemon.sh

意思为每分钟,执行一次 daemon.sh 脚本

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐