【问题标题】:Bash ping status scriptBash ping 状态脚本
【发布时间】:2013-08-22 11:19:20
【问题描述】:

我已经完成了以下脚本

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 分钟收到并通过电子邮件反映这一点。我想要的是添加该功能,以便它仅在状态更改时向我发送电子邮件。即,如果它关闭了,我不希望它在它启动之前发送任何进一步的更新。

【问题讨论】:

  • 如何将之前的结果保存在某个地方(在文件中)并与当前结果进行比较?
  • 是的,这就是我想做的,但不知道如何编码
  • 您可以使用两个文件:alivedown。然后例如,如果它已关闭,现在您检测到它再次关闭,请检查名称是否在 down 文件中。
  • 你能把它集成到我上面的代码中吗?
  • 您可以使用无限的while循环,直到状态正常为止,一旦主机关闭并从此发送邮件就会中断。

标签: bash ping


【解决方案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

【讨论】:

  • 哈哈,if [ $(grep -c "$myHost" $down_hosts) -eq 0 ]; then 很有趣。请改用if [[ grep -q "myHost" "$down_hosts" ]]; then。这是有效的,因为如果grep 找到任何东西,那么退出代码将为 0,否则为 1。任何大于 1 的东西都是错误的。另外,不要忘记 "$down_hosts" 周围的引号,因为如果 $down_hosts 包含任何空格,它将中断
  • 谢谢,@Aleks-DanielJakimenko!
  • @alekx 我将您的更改添加到上面并得到,./ping.sh:第 15 行:需要条件二元运算符 ./ping.sh:第 15 行:-q' ./ping.sh: line 15: 附近的语法错误如果 [ [ grep -q "myHost" "$down_hosts" ]];那么'
  • 我很抱歉。而不是if [[ grep -q "myHost" "$down_hosts" ]]; then 使用if grep -q "myHost" "$down_hosts"; then 因为在[[ ]]中没有必要
  • 使用在线的主机,每次脚本运行我都会收到一封电子邮件说它在线?
【解决方案2】:

在 cmets 中有一个优点,您可能希望使用无限循环。但是,由于您要求不同的东西,所以您可以这样做:

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

【讨论】:

  • cat: ns1.server.com: 没有这样的文件或目录
  • 此错误只会弹出一次,即您第一次启动脚本时。其他一切都应该正常工作。我将进行编辑
  • 您是否更改了 PATH_STATUS 中的目录?那个目录存在吗?
  • 是 /tmp ./ping.sh:第 9 行:意外令牌 newline', conditional binary operator expected ping.sh line 9: syntax error near prevStatus='unknown'' ping.sh:第 9 行:` [[ -f "$PATH_STATUS$myHost" ]] && prevStatus=$(cat "$PATH_STATUS$myHost") || prevStatus='未知''
  • 在这种情况下它必须是'/tmp/yourprefix'
猜你喜欢
  • 2013-11-25
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 2016-02-03
  • 2020-04-11
相关资源
最近更新 更多