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