Сповіщення про перепади підключення до Інтернету


9

Яке програмне забезпечення, яке відтворюватиме попередження (динамік ПК), коли протягом 5 хвилин немає підключення до Інтернету?

Здається, мій комутатор / маршрутизатор відключається кожні кілька днів, і я хочу скинути його, коли це станеться.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d

3
Не вказувати на очевидне, але ви приймаєте дуже кругле вирішення проблеми несправного комутатора / маршрутизатора
Michael Mrozek

Відповіді:


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. Зараз ми намагаємося пінг 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.


До речі, я використовую beepкоманду, чи безпечно це, chown /dev/tty0щоб я міг нею користуватися sudo?
Кокідзу

1
@Kokizzu - ні, ви не повинні змінювати право власності на /dev/tty0.
slm

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Команда на otherhand зазнає невдачі в протягом 1 секунди. Докладніше див. У моєму запитанні "Питання": Як перенаправити вихід будь-якої команди? . Я показую і використання, pingі fing.
slm

@slm, Дякую за ваше редагування, мене збентежило, як зробити так, щоб пінг тривав лише одну секунду
Nidal

Здається, це виконуватиме ping необмежену кількість разів за секунду, якщо вона реагує негайно, наприклад, коли мережа втрачає живлення. sleep 1достатньо, щоб цього не допустити.
Рей Фосс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.