feixiablog

 一年总有那么几次莫明停电,公司的服务器经不起这样的折腾 
写了一个断电后UPS备用电源自动关机的脚本 
原理就是检测路由器网关是否能ping通,长时间持续ping不通视为停电了 
路由器不要接到ups上 
用法 
    1.检测网关是否持续ping不通300次(forever模式,添加到启动任务即可)  
      sudo ./ups_check forever 192.168.1.1 300 
   2.检测网关是否持续ping不通30次(once模式,需要配合crond使用) 
      sudo ./ups_check once 192.168.1.1 30 

 

#!/bin/sh
 
# halt command
HALT=halt
 
ping_forever_host(){
    IP=$1
    time_out=$2
    count=3
    kernel=`uname -s`
    total_miss=0
    echo "ups check host \'${IP}\' for (${time_out}) seconds, [forever mode]"
 
    # ping host, if miss recieved packets, then add to total_miss
    while true
    do
        case $kernel in
            VMkernel)            #esxi 5.1
                ret=`ping -c ${count} -W 1 ${IP} 2>&1|grep \'packets transmitted\'|sed \'s/.*, \(.*\) packets received,.*/\1/\'`
                ;;
            Darwin)            #MacOS X 10.7.4
                ret=`ping -c ${count} -W 1 ${IP} 2>&1|grep \'packets transmitted\'|sed \'s/.*, \(.*\) packets received,.*/\1/\'`
                ;;
            Linux)            #ubuntu 12.04
                ret=`ping -c ${count} -W 1 ${IP} 2>&1|grep \'packets transmitted\'|sed \'s/.*, \(.*\) received,.*/\1/\'`
                ;;
            *)
                echo "Unknown Architecture $kernel"
                exit 1
                ;;
        esac
 
        miss=$((count-ret))
        if [ $miss -eq $count ]; then
            total_miss=$((total_miss+miss))
            echo "total_miss: ${total_miss} --> ${time_out}"
        else
            total_miss=0
        fi
         
        # if miss count over limit, then halt the computer!!!
        if [ $total_miss -ge $time_out ]; then
            echo "SYSTEM WILL HALT AT \'`date`\'!!!"
            ${HALT}
            break;
        fi
    done
}
 
ping_once_host(){
    IP=$1
    count=$2
    time_out=$2
    kernel=`uname -s`
    total_miss=0
    echo "ups check host \'${IP}\' for (${time_out}) seconds, [once mode]"
 
    # ping host, if miss recieved packets, then add to total_miss
    case $kernel in
        VMkernel)            #esxi 5.1
            ret=`ping -c ${count} -W 1 ${IP} 2>&1|grep \'packets transmitted\'|sed \'s/.*, \(.*\) packets received,.*/\1/\'`
            ;;
        Darwin)            #MacOS X 10.7.4
            ret=`ping -c ${count} -W 1 ${IP} 2>&1|grep \'packets transmitted\'|sed \'s/.*, \(.*\) packets received,.*/\1/\'`
            ;;
        Linux)            #ubuntu 12.04
            ret=`ping -c ${count} -W 1 ${IP} 2>&1|grep \'packets transmitted\'|sed \'s/.*, \(.*\) received,.*/\1/\'`
            ;;
        *)
            echo "Unknown Architecture $kernel"
            exit 1
            ;;
    esac
 
    miss=$((count-ret))
    if [ $miss -eq $count ]; then
        total_miss=$((total_miss+miss))
        echo "total_miss: ${total_miss} --> ${time_out}"
    else
        total_miss=0
    fi
     
    # if miss count over limit, then halt the computer!!!
    if [ $total_miss -ge $time_out ]; then
        echo "SYSTEM WILL HALT AT \'`date`\'!!!"
        ${HALT}
    fi
}
 
main(){
    action=$1;
    case $action in
        forever)            #run forever
            ping_forever_host $2 $3
            ;;
        once)               # run once
            ping_once_host $2 $3
            ;;
        *)
            echo "usage: sudo ./ups_check forever 192.168.2.1 120"
            echo "usage: sudo ./ups_check once 192.168.2.1 60"
            exit 1
            ;;
    esac
}
 
main $1 $2 $3

分类:

技术点:

相关文章:

  • 2022-01-19
  • 2021-11-02
  • 2021-04-17
  • 2021-12-19
  • 2021-05-14
  • 2022-12-23
  • 2021-11-11
猜你喜欢
  • 2021-11-28
  • 2021-10-20
  • 2022-12-23
  • 2021-10-01
  • 2021-09-15
  • 2022-12-23
  • 2021-07-20
相关资源
相似解决方案