linux 当站点在循环中更改ping结果时,Bash脚本以ping IP地址并报告日期戳

zpgglvta  于 2022-12-18  发布在  Linux
关注(0)|答案(1)|浏览(122)

我从需要通过SD/WAN网络ping远程办公室Cisco Catalyst开始。基本的ping命令工作得还可以接受,但大量的输出既令人生畏,也不是很有用。更具体地说,我需要的是远程Catalyst更改其ping状态时的日期和时间戳。无法到达的日期和时间,以及它再次可达的日期和时间。我不需要任何ping细节,只需要知道UP和DOWN发生的时间。我有一个脚本,它不能正常工作,所以我尝试简化它,而且它也不能正常工作。所以我转向你们,有没有其他人尝试过ping?

#!/bin/bash
skip=no
while :
do
    if [[ `ping -c 1 $1 &> /dev/null` ]] && [[ skip = "no" ]]
    then
        echo "Target is up at: $(TZ='America/New_York' date)"
            skip=yes
    else
        echo "Target is down at: $(TZ='America/New_York' date)"
            skip=yes
    fi
    if ping -c 1 $1 &> /dev/null
    then
        skip=no
    else
        skip=yes
    fi
    sleep 5
done

谢谢:)
我得到的结果并没有达到我的预期。我在本地有另一个Catalyst,我在局域网上配置了它,将其连接到10.1.1.51,当我将其连接到网络的其余部分时,我得到了它已启动的日期戳和ping响应,运行正常,然后我拔下它,过了一会儿,我得到了另一个时间戳,它的关闭。然后另一个报告,它的关闭,一个,又一个。我认为这是一个边缘情况,我认为错误是在我的如果,然后,否则,fi逻辑,但我已经尝试了许多其他安排,要么“Ping成功”消息重复,或者“Ping失败”消息重复,但不是我想要的方式,这只是报告当状态改变,否则只是坐在那里测试和ping和等待状态改变。我已经很多年没有这样做了,嘿,必要性是发明之母,我想。:)

4si2a6ki

4si2a6ki1#

我看到的第一件事是[[ping -c 1 $1 &> /dev/null]]总是失败,因为它测试ping -c 1 $1 &> /dev/null的输出是否为非空,并且由于输出被&> /dev/null丢弃,因此它永远只会是空的。我认为您只需要ping -c 1 $1 &> /dev/null(就像另一个if语句一样),而不需要其他任何错误。
skip的逻辑看起来也很奇怪;我会把它完全去掉,然后有两个独立的子循环:一个是在它工作的时候,一个是在它失败的时候。大概是这样的:

#!/bin/bash

# If the target is initially up, we need to print that
# before going into the monitor loop.
if ping -c 1 $1 &> /dev/null
then
    echo "Target is up at: $(TZ='America/New_York' date)"
fi

while :
do
    # At this point in the script, the target is either
    # up and we need to wait for it to go down, or we
    # just started and it's down (in which case this
    # loop will exit immediately).
    while ping -c 1 $1 &> /dev/null
    do
        sleep 5
    done

    # At this point, it's gone down; print a note, and
    # wait for it to come back up.
    echo "Target is down at: $(TZ='America/New_York' date)"
    until ping -c 1 $1 &> /dev/null
    do
        sleep 5
    done

    # It's back up! Print another note, then go back to
    # waiting for it to fail.
    echo "Target is up at: $(TZ='America/New_York' date)"
done

相关问题