Подтвердить что ты не робот

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

4b9b3361

Ответ 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.