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