我需要帮助才能更新此脚本,如果ping失败,它会向另一台主机发送一个wakonlan调用(除了ping失败后立即发送的电子邮件)。如何从这个脚本完成?
这就是我想要达成的目标:
Server1已启动> PingComputer ping server1 =一切都很好。 服务器1失败> PingComputer发送邮件并将wakeonlan调用发送到服务器2 = server2启动。
不太重要(只有在可能的情况下):在server1上发生故障后,我想在server1再次启动时收到邮件,然后这个场景重新开始。
#!/bin/bash
HOSTS="IP ADRESS"
COUNT=4
for myHost in $HOSTS
do
count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | a$
if [ $count -eq 0 ]; then
# 100% failed
echo "Server failed at $(date)" | mail -s "Server Down" myadress@gmail.com
echo "Host : $myHost is down (ping failed) at $(date)"
fi
done
我在所有3台计算机上使用ubuntu服务器btw。
答案 0 :(得分:0)
至少有一台主机必须始终可ping(ping成功= UP)
当pingable主机无法访问时(ping失败)=>邮件和:
- 如果另一个主机已经pingable =>没问题=>继续
- else => wakeonlan另一位主持人
当无法访问的主机变为pingable = =邮件
当wakeonlan之后主机仍然无法访问时,它=>邮件
初始脚本基于bash
。但是你的Ubuntu服务器似乎使用的bash
版本太旧而没有关联数组。幸运的是,zsh
支持关联数组一段时间。因此,zsh
重写了以下脚本。此外,还增加了对MAC ADDRESS的支持。
脚本one_host_should_ping.sh
:
#!/bin/zsh
MYADDRESS=myadress@gmail.com
NEXTHOSTWOL=${1?Please provide hosts as arguments of the script}
PINGABLECOUNT=0
# use associative array to store the state of each host
unset HOSTS
typeset -A HOSTS
unset MAC
typeset -A MAC
while (($#))
do
let PINGABLECOUNT++
HOSTS[$1]=PINGABLE
MAC[$1]=$2
echo >&2 -e "Input #$PINGABLECOUNT:\tIP=$1\tMAC=$2"
shift 2
done
nexthostwol() {
for host in ${(k)HOSTS[@]}
do
if [[ ${HOSTS[$host]} == UNREACHABLE ]]
then
NEXTHOSTWOL=$host
break
fi
done
}
report() {
for host in ${(k)HOSTS[@]}
do
echo "HOST IP=$host MAC=${MAC[$NEXTHOSTWOL]} state=${HOSTS[$host]}"
done
echo "Number of hosts Up = $PINGABLECOUNT"
}
pingable() {
let PINGABLECOUNT++
HOSTS[$1]=PINGABLE
SUBJECT="[Server Up] ping $1 success at $(date +%c)"
echo "$SUBJECT"
report | mail -s "$MESSAGE" "$MYADDRESS"
report
[[ $NEXTHOSTWOL == $1 ]] && nexthostwol
}
unreachable() {
let PINGABLECOUNT--
HOSTS[$1]=UNREACHABLE
SUBJECT="[Server Down] ping $1 failed at $(date +%c)"
if [[ $PINGABLECOUNT -le 0 ]]
then
wakeonlan -i $NEXTHOSTWOL ${MAC[$NEXTHOSTWOL]}
HOSTS[$NEXTHOSTWOL]=WAKEONLAN
SUBJECT="$SUBJECT => wakeonlan $NEXTHOSTWOL"
fi
echo "$SUBJECT"
report | mail -s "$MESSAGE" "$MYADDRESS"
report
}
stillwol() {
SUBJECT="[Server Down] ping $1 failed at $(date +%c)"
echo "$SUBJECT"
report | mail -s "$MESSAGE" "$MYADDRESS"
report
}
# infinite loop => check every 5 minutes
# use CTRL+C or kill to break it
while true
do
for host in ${(k)HOSTS[@]}
do
STATE=${HOSTS[$host]}
case $STATE in
UNREACHABLE) ping -c 1 $host && pingable $host ;;
PINGABLE) ping -c 1 $host || unreachable $host ;;
WAKEONLAN) ping -c 1 $host && pingable $host || stillwol $host ;;
*) echo >&2 "ERROR: $host is in an unexpected state=[$STATE]";;
esac
done
echo "will check again in 5 minutes"
sleep $((5*60))
done
授予执行权限:
chmod +x one_host_should_ping.sh`
如果您使用两台主机:
./one_host_should_ping.sh IP1 MAC1 IP2 MAC2
如果您使用五台主机:
./one_host_should_ping.sh IP1 MAC1 IP2 MAC2 IP3 MAC3 IP4 MAC4 IP5 MAC5
root@myc:/usr/local# ./one_host_should_ping.sh 192.168.0.197 00:1c:26:5c:7e:d5 192.168.0.187 f4:6d:04:e5:5c:4c
Input #1: IP=192.168.0.197 MAC=00:1c:26:5c:7e:d5
Input #2: IP=192.168.0.187 MAC=f4:6d:04:e5:5c:4c
PING 192.168.0.187 (192.168.0.186) 56(84) bytes of data.
From 192.168.0.168 icmp_seq=1 Destination Host Unreachable
--- 192.168.0.187 ping statistics
--- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
[Server Down] ping 192.168.0.187 failed at tor 26 jan 2012 12.44.29
HOST IP=192.168.0.186 MAC=00:1c:26:5c:7e:d5 state=UNREACHABLE
HOST IP=192.168.0.197 MAC=00:1c:26:5c:7e:d5 state=PINGABLE
Number of hosts Up = 1
PING 192.168.0.197 (192.168.0.197) 56(84) bytes of data.
From 192.168.0.168 icmp_seq=1 Destination Host Unreachable
--- 192.168.0.197 ping statistics
--- 1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
Sending magic packet to 192.168.0.197:9 with 00:1c:26:5c:7e:d5
[Server Down] ping 192.168.0.197 failed at tor 26 jan 2012 12.44.36
=> wakeonlan 192.168.0.197
HOST IP=192.168.0.187 MAC=00:1c:26:5c:7e:d5 state=UNREACHABLE
HOST IP=192.168.0.197 MAC=00:1c:26:5c:7e:d5 state=WAKEONLAN
Number of hosts Up = 0
will check again in 5 minutes