Bash цикл пинга успешный

Я думаю, что это должно быть изменено на какое-то время, в настоящий момент он будет ждать, пока все 10000 пингов не будут выполнены, мне нужно, чтобы он вернулся, когда пинг прошел успешно. Программа "say" находится на 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"

Ответы

Ответ 1

Вероятно, вы не должны полагаться на текстовый вывод команды, чтобы решить эту проблему, особенно когда команда ping дает вам отличное возвращаемое значение:

Утилита ping возвращает статус выхода из нуля, если хотя бы один ответ был услышан от указанного хоста; статус двух, если передача прошла успешно, но ответы не были получены; или другое значение из <sysexits.h>, если произошла ошибка.

Другими словами, используйте что-то вроде:

((count = 100))                            # 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 to exit loop.
    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

Ответ 2

Вам не нужно использовать echo или grep. Вы можете сделать это:

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

Ответ 3

Это также можно сделать с таймаутом:

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

Ответ 4

Я использую этот Bash script для проверки состояния Интернета каждую минуту на 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

Ответ 5

Если вы используете опцию -o, Mac OS Xs ping выйдет после получения одного пакета ответа.

Дополнительная литература: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/ping.8.html

РЕДАКТИРОВАТЬ: paxdiablo делает очень хороший момент об использовании статуса выхода ping s в ваших интересах. Я бы сделал что-то вроде:

#!/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 выполнит соответствующий оператор.

Ответ 6

Здесь мое однострочное решение:

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 [email protected]'

Это запускает бесконечный пинг в новом сеансе экрана до тех пор, пока не появится ответ, после чего он отправит электронное письмо на адрес [email protected]. Полезно в возрасте электронной почты, отправленной на телефоны.

(Возможно, вы захотите проверить, что mail настроен правильно, только сначала запустив echo test | mail -s test [email protected]. Конечно, вы можете делать все, что хотите, от done; вперед, звучать звонок, запускать веб-браузер, использовать свое воображение.)