首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >server1失败时唤醒server2的脚本

server1失败时唤醒server2的脚本
EN

Stack Overflow用户
提问于 2012-01-23 21:34:10
回答 1查看 463关注 0票数 1

我需要帮助来更新这个脚本,如果ping失败,它将发送一个wakonlan呼叫到另一个主机(除了现在发送的电子邮件,如果ping失败)。在这个脚本中如何做到这一点呢?

这就是我想要实现的:

Server1 is up > PingComputer ping server1 =一切正常。服务器1出现故障> PingComputer向服务器2发送邮件并发送唤醒呼叫= server2启动。

不那么重要(只有在可能的情况下):在server1出现故障后,我希望在server1重新启动时收到一封邮件,然后这个场景重新开始。

代码语言:javascript
复制
    #!/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

我正在使用ubuntu服务器的所有3台电脑btw。

EN

回答 1

Stack Overflow用户

发布于 2012-01-25 04:46:51

规格说明

至少有一台主机必须始终可ping通(ping成功=向上)。

当可ping通的主机变得无法访问(ping失败)时,=>邮件和:

  • 如果另一台主机已经可以else通,则=>没有问题=> continue
  • 否则=>唤醒另一台主机

当无法访问的主机变得可以back回=>邮件时

当主机在唤醒后仍无法访问时,它会发送=>

脚本

最初的脚本是基于bash的。但是你的Ubuntu Server似乎使用的bash版本太旧了,没有关联数组。幸运的是,zsh在一段时间内支持关联数组。因此,已经为zsh重写了以下脚本。此外,还添加了对MAC地址的支持。

脚本one_host_should_ping.sh

代码语言:javascript
复制
#!/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

用法

赋予执行权限:

代码语言:javascript
复制
chmod +x one_host_should_ping.sh`

如果您使用两个主机:

代码语言:javascript
复制
./one_host_should_ping.sh  IP1 MAC1 IP2 MAC2

如果您使用五个主机:

代码语言:javascript
复制
./one_host_should_ping.sh  IP1 MAC1  IP2 MAC2  IP3 MAC3  IP4 MAC4  IP5 MAC5

示例

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8972444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档