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;
вперед, звучать звонок, запускать веб-браузер, использовать свое воображение.)