2013-08-22 46 views
0

我已经做了下面的脚本通过cron猛砸ping状态脚本

HOSTS="ns1.server.com ns2.server.com" 
SUBJECT="Host Down" 

for myHost in $HOSTS 
do 
count=$(ping -c 10 $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{    
print $1 }') 
if [ $count -eq 0 ]; then 
echo "Host : $myHost is down (ping failed) at $(date)" | sendEmail -f email (email address removed) -u "$SUBJECT" etc etc 
fi 
done 

运行每5分钟然而,当一台主机宕机,我会接受并每5分钟反映此电子邮件。我想要的是添加该功能,以便它只在状态发生变化时通过电子邮件发送给我。即如果它关闭,我不希望它发送任何进一步的更新,直到它启动。

+0

什么地方保存先前的结果(在文件中),并与比较当前结果? – fedorqui

+0

是的,这就是我想要做的,但不知道如何编写它 – Lurch

+0

你可以使用两个文件:'活着'和'下'。然后,例如,如果它已关闭,现在您检测到它再次关闭,请检查该名称是否在“down”文件中。 – fedorqui

回答

1

我觉得这样的事情可以帮助:

#!/bin/bash 

HOSTS="ns1.server.com ns2.server.com" 
HOSTS="123.123.1.1 ns1.server.com" 
SUBJECT="Host Down" 

ping_attempts=1 
down_hosts=down_hosts.txt 

for myHost in $HOSTS 
do 
     count=$(ping -c $ping_attempts $myHost | awk -F, '/received/{print $2*1}') 
     echo $count 
     if [ $count -eq 0 ]; then 
       echo "$myHost is down" 
       if [ $(grep -c "$myHost" "$down_hosts") -eq 0 ]; then 
         echo "Host : $myHost is down (ping failed) at $(date)" 
         echo "$myHost" >> $down_hosts 
       fi 
     else 
       echo "$myHost is alive" 
       if [ $(grep -c "$myHost" "$down_hosts") -eq 1 ]; then 
         echo "Host : $myHost is up (ping ok) at $(date)" 
         sed -i "/$myHost/d" "$down_hosts" 
       fi 
     fi 
done 
+0

哈哈,''if [$(grep -c“$ myHost”$ down_hosts)-eq 0];那么''很有趣。使用''if [[grep -q“myHost”“$ down_hosts”]];那么''而不是。这是有效的,因为如果''grep''找到任何东西,那么退出代码将为0,否则为1.任何大于1的值都是错误。另外,不要忘记'''$ down_hosts“'''周围的引号,因为如果'$ down_hosts''包含任何空格,它将会中断 –

+0

Thanks,@ Aleks-DanielJakimenko! – fedorqui

+0

@alekx我把你的改变添加到了上面,得到了./ping.sh:第15行:期望的条件二元运算符 ./ping.sh:第15行:在'-q'附近的语法错误 ./ping.sh:第15行:'if [[grep -q“myHost”“$ down_hosts”]];然后' – Lurch

0

评论中有一个很好的观点,您可能想要使用无限循环。但是,正如你问不同的东西,在这里你去:

HOSTS="ns1.server.com ns2.server.com" 
SUBJECT="Host Down" 
PATH_STATUS='/yourfolder/hoststatus_' # For example can be located in /tmp. 

for myHost in $HOSTS; do 
    count=$(ping -c 10 "$myHost" | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }') 
    [[ -f "$PATH_STATUS$myHost"]] && prevStatus=$(cat "$PATH_STATUS$myHost") || prevStatus='unknown' 
    [[ $count == 0 ]] && curStatus='down' || curStatus='up' 

    if [[ $curStatus != $prevStatus ]]; then 
     echo "$curStatus" > "$PATH_STATUS$myHost" 
     echo "Host : $myHost is $curStatus at $(date)" | sendEmail 
    fi 
done 
+0

cat:ns1.server.com:没有这样的文件或目录 – Lurch

+0

第一次启动脚本时,此错误只会弹出一次。其他一切都应该正常工作。我将编辑 –

+0

即使重新运行,也不会创建任何文件。 – Lurch