unix Bash循环ping成功

jmp7cifd  于 2023-05-06  发布在  Unix
关注(0)|答案(7)|浏览(180)

我在想,这需要改为while子句,目前它会等到所有10000 ping完成,我需要它返回时,ping成功。OSX上的程序“说”让电脑说话。

#!/bin/bash
echo begin ping
if ping -c 100000 8.8.8.8 | grep timeout;
then echo `say timeout`;
else echo `say the internet is back up`;
fi

好吧,我没有权利回答我自己的问题,所以在玩了一圈之后,我的答案是:
谢谢,是的,我不知道$?直到现在。不管怎样,现在我已经做了这个。我喜欢你的不去永远,但在我的情况下,我不需要它停止,直到它完成。

#!/bin/bash
intertube=0
echo "begin ping"
while [ $intertube -ne 1 ]; do
        ping -c 3 google.com
        if [ $? -eq  0 ]; then
                echo "ping success";
                say success
                intertube=1;
        else
                echo "fail ping"
        fi
done
echo "fin script"
umuewwlo

umuewwlo1#

你可能不应该依赖命令的文本输出来决定这一点,* 特别是 * 当ping命令给你一个非常好的返回值时:
如果从指定主机至少听到一个响应,则ping实用程序返回退出状态零;如果传输成功但没有接收到响应,则状态2;或者如果发生错误,则从<sysexits.h>获取另一个值。
换句话说,使用类似于:

((count = 60))                           # Maximum number to try.
while [[ $count -ne 0 ]] ; do
    ping -c 1 8.8.8.8                    # Try once.
    rc=$?
    if [[ $rc -eq 0 ]] ; then
        ((count = 1))                    # If okay, flag loop exit.
    else
        sleep 1                          # Minimise network storm.
    fi
    ((count = count - 1))                # So we don't go forever.
done

if [[ $rc -eq 0 ]] ; then                # Make final determination.
    echo `say The internet is back up.`
else
    echo `say Timeout.`
fi
deikduxw

deikduxw2#

你不需要使用echo或grep。你可以这样做:

ping -oc 100000 8.8.8.8 > /dev/null && say "up" || say "down"
3b6akqbq

3b6akqbq3#

这也可以通过超时来完成:

# Ping until timeout or 1 successful packet
ping -w (timeout) -c 1
wfsdck30

wfsdck304#

我使用这个Bash脚本来测试OSX上每分钟的互联网状态

#address=192.168.1.99  # forced bad address for testing/debugging
address=23.208.224.170 # www.cisco.com
internet=1             # default to internet is up

while true;
do
    # %a  Day of Week, textual
    # %b  Month, textual, abbreviated
    # %d  Day, numeric
    # %r  Timestamp AM/PM
    echo -n $(date +"%a, %b %d, %r") "-- " 
    ping -c 1 ${address} > /tmp/ping.$
    if [[ $? -ne 0 ]]; then
        if [[ ${internet} -eq 1 ]]; then   # edge trigger -- was up now down
            echo -n $(say "Internet down") # OSX Text-to-Speech
            echo -n "Internet DOWN"
        else
            echo -n "... still down"
        fi
        internet=0
    else
        if [[ ${internet} -eq 0 ]]; then     # edge trigger -- was down now up
            echo -n $(say "Internet back up") # OSX Text-To-Speech
        fi
        internet=1
    fi   
    cat /tmp/ping.$ | head -2 | tail -1
    sleep 60 ; # sleep 60 seconds =1 min
done
mzsu5hc0

mzsu5hc05#

如果您使用-o选项,BSD ping(也在macOS上)将在收到一个回复数据包后退出。
进一步阅读:https://www.freebsd.org/cgi/man.cgi?query=ping

编辑:paxdiablo很好地说明了如何利用ping的退出状态。我会这样做:

#!/usr/bin/env bash
echo 'Begin ping'
if ping -oc 100000 8.8.8.8 > /dev/null; then
    echo $(say 'timeout')
else
    echo $(say 'the Internet is back up')
fi

ping将发送最多100,000个数据包,然后以失败状态退出-除非它收到一个应答数据包,在这种情况下,它以成功状态退出。然后if将执行相应的语句。

**编辑2:**克里斯指出我的逻辑是颠倒的,这只是令人尴尬。此外,echo命令(从问题继承而来)没有任何用途,也没有必要特别要求bash。我对12年前的我很失望。今天我会写:

#!/bin/sh
if ping -oc 100000 8.8.8.8 >/dev/null; then
    say 'the Internet is back up'
else
    say timeout
fi
9wbgstp7

9wbgstp76#

以下是我的一行程序解决方案:

screen -S internet-check -d -m -- bash -c 'while ! ping -c 1 google.com; do echo -; done; echo Google responding to ping | mail -s internet-back my-email@example.com'

这将在新的屏幕会话中运行无限ping,直到有响应为止,此时它将向my-email@example.com发送一封电子邮件。在电子邮件发送到手机的时代很有用。
(You您可能需要先运行echo test | mail -s test my-email@example.com来检查mail是否配置正确。当然,从done;开始,你可以做任何你想做的事情,敲个铃,启动一个web浏览器,发挥你的想象力。

ia2d9nvy

ia2d9nvy7#

我喜欢paxdiablo的脚本,但想要一个可以无限运行的版本。此版本运行ping,直到建立连接,然后打印一条消息。

echo "Testing..."

PING_CMD="ping -t 3 -c 1 google.com > /dev/null 2>&1"

eval $PING_CMD

if [[ $? -eq 0 ]]; then
    echo "Already connected."
else
    echo -n "Waiting for connection..."

    while true; do
        eval $PING_CMD

        if [[ $? -eq 0 ]]; then
            echo
            echo Connected.
            break
        else
            sleep 0.5
            echo -n .
        fi
    done
fi

我还有一个Gist of this script,我会根据需要更新修复和改进。

相关问题