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