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