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