Bash ping状态脚本

时间:2013-08-22 11:19:20

标签: bash 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分钟通过cron运行一次,但是当主机关闭时,我会每隔5分钟收到一封电子邮件,反映这一点。我想要的是添加功能,以便它只在状态发生变化时通过电子邮件发送给我。即如果它失败了我不希望它发送任何进一步的更新,直到它。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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