Bash script, чтобы (более или менее) надежно проверить, встал ли Интернет

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

Вот как я это сделал:

#! /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)

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

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

  • Под "internet is up", я имею в виду мое подключение к Интернету.

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

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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