2010-05-27 2 views
10

Мне нужен сценарий Bash (или простой оболочки), чтобы вставить cronjob, который каждую минуту проверяет, работает ли Интернет.Сценарий Bash, чтобы (более или менее) надежно проверить, находится ли в Интернете

Это, как я это сделал:

#! /bin/sh 

host1=google.com 
host2=wikipedia.org 
curr_date=`date +"%Y%m%d%H%M"` 

echo -n "${curr_date};" 
((ping -w5 -c3 $host1 || ping -w5 -c3 $host2) > /dev/null 2>&1) && 
echo "up" || (echo "down" && exit 1) 

Как бы вы это сделать? Какие хосты вы будете пинговать?

Разъяснение:

  • К "в Интернете до", я имею в виду моего подключения к Интернету.

  • К «до», я имею в виду иметь доступное соединение (на самом деле не имеет значения, если мы говорим о DNS время вниз или соединение действительно очень медленно [Разум -w для тайм-аут]). Вот почему я не включил ни одного IP-адреса, а только хосты.

Должен ли я также перекрыть переполнение стека? Я имею в виду, если я не могу получить доступ к Google, Википедии или переполнению стека, я не хочу интернет: p

+0

Google является то, что я всегда использую, чтобы проверить, если у меня есть связь. –

+0

8.8.8.8 было бы хорошо, тем более, что это многоадресная рассылка. –

+6

Интернет в целом, как правило, «вверх». Однако вашего подключения к нему может и не быть! ;-) –

ответ

5

Это похоже на хорошее решение. Просто добавьте еще несколько хостов и, возможно, несколько чистых IP-хостов, чтобы вы не полагались на работу DNS (что само по себе зависит от вашего определения «вверх»).

+1

Фактически, в зависимости от функционирования DNS может быть хорошо. Если вы хотите проверить фактическое «Я могу просматривать веб-сайт как обычный» -операцию, тогда для поддержки DNS требуется «Хорошая вещь». –

1

Какую часть подключения к Интернету вы хотите проверить? DHCP? DNS? Физически подключается к гнезду? Ядро признает наличие сетевого адаптера?

Вы можете вручную запросить DNS-сервер (ы) вашего ISP с помощью команды host(1). Это, как правило, хороший показатель того, потерял ли ваш маршрутизатор соединение с интернет-провайдером.

Вы можете запросить, какие интерфейсы имеют ваше ядро, используя netstat(8) или ifconfig(8).

Подробную статистику по интерфейсу можно получить, используя ifstat.

4

Спасибо за ваш код, он прекрасно работает, я оставил только одну строку на самом деле:

((ping -w5 -c3 8.8.8.8 || ping -w5 -c3 4.2.2.1) > /dev/null 2>&1) && echo "up" || (echo "down" && exit 1)