停电后,在UPS电源下服务器自动关机脚本


 一年总有那么几次莫明停电,公司的服务器经不起这样的折腾 
写了一个断电后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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM