Вы можете использовать модифицированную версию этого скрипта, чтобы делать то, что вы хотите:
#!/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
.