これを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"
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
Echoまたはgrepを使用する必要はありません。これを行うことができます:
ping -oc 100000 8.8.8.8 > /dev/null && say "up" || say "down"
これはタイムアウトで行うこともできます:
# Ping until timeout or 1 successful packet
ping -w (timeout) -c 1
-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
は適切なステートメントを実行します。
この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
これが私のワンライナーソリューションです。
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;
以降で必要なことは何でもできます。 、 想像力を使って。)
私は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
このスクリプトの要点 もあり、必要に応じて修正と改善を加えて更新します。