Bash-ping状态脚本

Bash-ping状态脚本,bash,ping,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

我已经完成了以下脚本

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分钟收到一封反映这一点的电子邮件。我想要的是添加功能,这样它只在状态改变时给我发电子邮件。ie如果它关闭了,我不希望它在启动之前发送任何进一步的更新

评论中有一点很好,您可能希望使用无限循环。但既然你要求的是不同的东西,那就来吧:

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

我认为这样做会有所帮助:

#!/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

将以前的结果保存到某个位置(文件中)并与当前结果进行比较怎么样?是的,这是我想做的,但不知道如何编码。您可以使用两个文件:
活动的
向下的
。例如,如果它已关闭,现在您检测到它再次关闭,检查名称是否在
down
文件中。您可以将其集成到我的上述代码中吗?您可以使用一个无限while循环,该循环为true,直到状态为ok,并在主机关闭并从此发送邮件后中断。cat:ns1.server.com:没有此类文件或目录此错误只会弹出一次,第一次启动脚本时。其他一切都应该很好。我将进行编辑您是否更改了处于路径\状态的目录?该目录是否存在?对/tmp./ping.sh是:第9行:意外标记
newline',条件二进制运算符应为ping.sh第9行:靠近
prevStatus='unknown''的语法错误ping.sh:第9行:`[[-f“$PATH\u STATUS$myHost]”和&prevStatus=$(cat“$PATH\u STATUS$myHost”)| | prevStatus='unknown''在这种情况下,它必须是'/tmp/yourprefix'Haha,
if[$(grep-c“$myHost”$down_hosts)-eq 0];那么
就很有趣了。如果[[grep-q“myHost”“$down_hosts”]],则使用
;然后改为
。这是因为如果
grep
找到任何东西,那么退出代码将为0,否则为1。任何大于1的值都是错误。另外,不要忘记
“$down\u hosts”
周围的引号,因为如果
$down\u hosts
包含任何空格,它将中断,@Aleks DanielJakimenko@alekx我将您的更改添加到上面,并得到,./ping.sh:第15行:预期的条件二进制运算符。/ping.sh:第15行:
-q'./ping.sh:第15行:
if[[grep-q“myHost”“$down\u hosts]”附近的语法错误;那我很抱歉。而不是
if[[grep-q“myHost”“$down_hosts”];然后
使用
如果grep-q“myHost”“$down\u hosts”;然后
因为[[]]不需要使用联机主机,所以每次脚本运行时,我都会收到一封电子邮件,说它联机了?