Ви можете використовувати модифіковану версію цього сценарію, щоб робити те, що вам потрібно:
#!/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
. Зараз ми намагаємося пінг Google.
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
Тепер ми обчислюємо будь-який час $downTime
простою, якщо пінг не вдається, інакше скидаємо $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 секунд.
Ми приклад "ВІДКРИТИ"
Тепер , щоб імітувати «з'єднання вниз» стан, ми будемо поміняти ім'я хоста , ми Pinging і використовувати підроблений, 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
вищезгаданим способом, ви, швидше за все, зіткнетеся з повільним затримкою часу, коли ping
для відключення з’єднання потрібно, щоб буквально 10-20 секунд. Дивіться мою відповідь на цю запитання U&L під назвою: Як перенаправити вихід будь-якої команди? для прикладу, використовуючи fing
замість цього інструмент командного рядка . Цей інструмент вийде з ладу швидше, ніж традиційний ping
.