Интернет-соединение обрывается

9

Какое программное обеспечение будет воспроизводить оповещение (динамик ПК), если в течение 5 минут нет подключения к Интернету?

Кажется, мой коммутатор / маршрутизатор отключается каждые несколько дней, и я хочу сбросить его, когда это произойдет.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
источник
3
Не для того, чтобы указать на очевидное, но вы принимаете очень окольное решение проблемы неисправного коммутатора / маршрутизатора
Майкл Мрозек

Ответы:

7

Вы можете использовать модифицированную версию этого скрипта, чтобы делать то, что вы хотите:

#!/bin/bash

downTime=0
lastAccessTime=$(date +"%s")
while [ true ]; do
if ! ping -c1 google.com >& /dev/null; then
    downTime=$(( $(date +"%s") - $lastAccessTime ))
else
    downTime=0
    lastAccessTime=$(date +"%s")
fi

sleep 15

if [ $downTime -ge 300 ]; then
   echo "alert"
fi
done

Мы "СВЯЗАННЫЙ" Пример

С включенной отладкой вы можете увидеть, что делает скрипт.

set -x

Запуск с действительным именем хоста для демонстрации состояния «соединение установлено».

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'

Вышеприведенный код инициализирует пару переменных и определяет, когда мы в последний раз проходили цикл $lastAccessTime. Теперь попробуем пинговать гугл.

+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955

Теперь мы вычисляем любое время простоя $downTime, если ping не удается, в противном случае, мы сбрасываем $downTimeна ноль и пересчитываем $lastAccessTime.

+ sleep 15

Теперь ждем 15 секунд.

+ '[' 0 -ge 300 ']'

Теперь мы проверим, были ли мы не более 5 минут (300 секунд). Затем мы повторяем прохождение whileцикла.

+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....

Пока мы встаём, ничего не случится, кроме того, что мы проверяем pingкоманду каждые 15 секунд.

Мы "ОТКЛЮЧЕННЫЙ" Пример

Теперь, чтобы смоделировать состояние «соединение разорвано», мы поменяем имя хоста, которое пингуем, и используем поддельное имя google1234567890.com. Повторяя запуск нашего скрипта с включенной отладкой, мы теперь видим, как вычисляется некоторое время простоя.

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402277506
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=0
+ sleep 15
+ '[' 0 -ge 300 ']'
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=15
+ sleep 15
...

Обратите внимание, что на данный момент $downTimeоно равно 15 секундам. Если мы подождем еще немного, мы увидим это:

+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15

Мы накопили 300 секунд простоя. Итак, теперь, когда мы проверяем, мы печатаем сообщение alert.

+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15

Это состояние будет продолжаться до тех пор, пока соединение не будет восстановлено и pingснова не будет успешным.

Так что насчет звука?

Это легко. Вы можете использовать различные инструменты для этого. Я хотел бы использовать что-то вроде soxили mplayerдля воспроизведения аудиофайла, такого как .mp3или .wavфайл с соответствующим звуком, который вы хотите слышать каждые 15 секунд, когда соединение не работает.

mplayer someaudio.wav

Просто замените alertсообщение выше этой строкой, чтобы получить звуковую обратную связь о том, что соединение разорвано.

Решая проблемы с пингом

Если вы воспользуетесь pingописанным выше способом, вы, вероятно, столкнетесь с медленным временем задержки, когда pingдля сбоя соединения при разрыве соединения требуется буквально 10-20 секунд. Смотрите мой ответ на этот вопрос и ответ U & L под названием: Как перенаправить вывод любой команды? для примера, используя fingвместо этого инструмент командной строки . Этот инструмент выйдет из строя быстрее, чем традиционный ping.

SLM
источник
Кстати, я использую beepкоманду, это безопасно, chown /dev/tty0чтобы я мог использовать его без sudo?
Кокиццу
1
@Kokizzu - нет, вы не должны менять владельца на /dev/tty0.
СЛМ
1
Ура sox! @Kokizzu - право ОДС в о выходе разрешения на /dev/tty0устройство в одиночку, но вы можете получить псевдо-терминал /dev/pts/[num] устройство - один и тот же тип устройства символов, xtermиспользование для каждого окна, например - с чем - то вроде screenили tmuxили даже ssh. Этим вы можете более безопасно управлять, так как они в /dev/ptmxлюбом случае являются только подчиненными устройствами на главном устройстве и не вызовут таких же проблем, как, скажем, /bin/loginпроцесс, принадлежащий пользователю, - что может случиться в другом случае.
mikeserv
aplay alert.wavэто более стандартный способ воспроизведения звука, поскольку он является частью системы ALSA и поставляется в большинстве дистрибутивов.
Рэй Фосс
4

если вы используете Linux, вы можете использовать ping в скрипте, google.comнапример:

counter=0
while [ true ]
do
ping -c 1 google.com > /dev/null 2>&1
if [ $? -ne 0 ] 
then
    let "counter +=1"
else
    let "counter = 0"
fi
if [ $counter -eq 300 ] # we assume that one ping need one second (300 is 5 minutes)
then
   echo "alert"
fi
done
Нидал
источник
3
Это будет работать, но вы можете рассмотреть возможность использования fingвместо ping. pingCMD. может потерпеть неудачу, если это не удастся. Команда fingс другой стороны потерпит неудачу в течение 1 секунды. См. Мои ответы на эти вопросы и ответы: как перенаправить вывод любой команды? , Я показываю как с помощью pingи fing.
SLM
@slm, спасибо за ваше редактирование, я не понял, как сделать так, чтобы пинг длился только одну секунду
Nidal
Кажется, что это будет выполнять пинг неограниченное количество раз в секунду, если он отвечает немедленно, например, когда сеть Ethernet теряет питание. sleep 1достаточно, чтобы предотвратить это.
Рэй Фосс