web-dev-qa-db-ja.com

バッシュループping成功

これをwhile句に変更する必要があると考えています。10000のpingがすべて完了するまで待機しますが、pingが成功したときに戻る必要があります。プログラム「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

OK私は自分の質問に答える権利を持っていないので、いじくり回した後の私の答えは次のとおりです。

ありがとう、ええ、私は$について知りませんでしたか?今まで。とにかく今、私は行ってこれを作りました。私はあなたのものが永遠に行かないのが好きですが、私の状況では、それが終わるまで停止する必要はありませんでした。

#!/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"
17
edumike

pingコマンド が完全にあなたを与えるとき、あなたはおそらくこれを決定するためにコマンドのテキスト出力に頼るべきではありません特に良い戻り値

指定されたホストから少なくとも1つの応答があった場合、pingユーティリティはゼロの終了ステータスを返します。送信は成功したが応答が受信されなかった場合は、ステータス2。または、エラーが発生した場合は<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
28
paxdiablo

Echoまたはgrepを使用する必要はありません。これを行うことができます:

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

これはタイムアウトで行うこともできます:

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

-oオプションを使用すると、Mac OS Xのpingは1つの応答パケットを受信した後に終了します。

さらに読む: http://developer.Apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/ping.8.html

[〜#〜] edit [〜#〜]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パケットを送信し、1つの応答パケットを受信しない限り、失敗ステータスで終了します。その場合、成功ステータスで終了します。その後、ifは適切なステートメントを実行します。

3

この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
3
Michaelangel007

これが私のワンライナーソリューションです。

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]'

これにより、応答があるまで新しい画面セッションで無限のpingが実行され、その時点で[email protected]に電子メールが送信されます。電話に送信される電子メールの時代に役立ちます。

(最初にecho test | mail -s test [email protected]を実行するだけで、mailが正しく構成されていることを確認できます。もちろん、done;以降で必要なことは何でもできます。 、 想像力を使って。)

1
pwaller

私は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

このスクリプトの要点 もあり、必要に応じて修正と改善を加えて更新します。

0
John Karahalis