LINUX.ORG.RU
решено ФорумAdmin

Мониторинг доступности интернета на bash

 , ,


1

1

Всем привет!

В академических целях занимаюсь велосипедостроением, поэтому не ищите много смысла в этом скрипте.

Нашел скрипт, который логирует недоступность заданного хоста и пишет об этом в лог. У меня есть gsm-шлюз, и я подключил отправку себе смс при падении интернета.

Выглядит все это вот так:

#!/bin/bash
PHONES="999999999"                                            
HTTP=http://192.168.1.221:9090/sendsms                          #адрес на шлюзе для запроса
USER=user                                                       #пользователь для авторизации на шлюзе
PASS=password
hostname=$(/bin/hostname -f)
send_bad_msg ()
{
for PHONE in $PHONES
do
curl -s -X POST -d "username=$USER&password=$PASS&phonenumber=$PHONE&message=$hostname Internet link is DOWN" $HTTP? > /dev/null
done
}
send_good_msg ()
{
for PHONE in $PHONES
do
curl -s -X POST -d "username=$USER&password=$PASS&phonenumber=$PHONE&message=$hostname Connection to Internet restored" $HTTP? > /dev/null
done
}
# Скрипт в бесконечном цикле пингует удалённый хост в инете с интервалом 60 сек
# при первой удачной или неудачной попытке пинга пишется соответствующее сообщение в лог
# следующая запись в лог делается только при изменении состояния связи
# инициализация переменной результата, по умолчанию считается, что связь уже есть
result=connected
# смена текущего каталога перед записью лога
cd /var/log
echo `date +%Y.%m.%d__%H:%M:%S`' Run script ' >> ping.log
# бесконечный цикл
while [ true ]; do
    # пинг хоста с последующей проверкой на ошибки
    errorscount="$(ping -c 2 -W 4 192.168.1.24 2<&1| grep -icE 'unknown|expired|unreachable|time out|100% packet loss')"
    # если предыдущий пинг был удачен, а текущий нет, т.е. вывод ping содержит ошибки, то
    if [ "$result" = connected -a "$errorscount" != 0 ]; then
    # запоминаем результат текущего пинга    # запоминаем результат текущего пинга
    result=disconnected
    # и пишем в лог время разрыва соединения
    echo `date +%Y.%m.%d__%H:%M:%S`' * connection break' >> ping.log 
	sleep 30
	if [ "$errorscount" != 0 ]; then 
		send_bad_msg
	fi
    fi
    # если предыдущий пинг был неудачен, а текущий успешен, то
    if [ "$result" = disconnected -a "$errorscount" = 0 ]; then
    # запоминаем результат текущего пинга
    result=connected
    # и пишем в лог время установки соединения
    echo `date +%Y.%m.%d__%H:%M:%S`' connection restore' >> ping.log && send_good_msg
    fi
	sleep 10
done

Иногда (чаще всего в 05:06 утра) Интернет отключается на 30 секунд, приходит смс, все как положено. Однако 30 секунд в 5 утра - это не критичное событие, и я хотел отложить отправку смс, если пинга нет менее 30 секунд.

Как понимаю, есть два пути решения - или увеличить кол-во пингов, необходимых для проверки соединения, либо ввести какой-то счетчик, который будет считать количество состояний для $errorscount, и отталкиваясь от счетчика, отправлять смс.

Однако сейчас я поставил просто таймаут.

    echo `date +%Y.%m.%d__%H:%M:%S`' * connection break' >> ping.log 
	sleep 30
	if [ "$errorscount" != 0 ]; then 
		send_bad_msg
	fi
    fi

Прошу подсказать, насколько это корректное решение, относительно решения текущего вопроса?

Странно, сделал code=Bash /code, а подсветки не появилось

Ответ на: комментарий от anc

ой вэй, слишком тонко походу для меня, локализованный ping и без этого гражданина можно найти уже сейчас

anonymous ()
Ответ на: комментарий от anonymous

Зато какой простор для «творчества», потом переписываем grep с «читалкой» QR кода и т.д. :)

anc ★★★★★ ()

Ну чтож, работающий код по предоставленному условию:

send_sms=1
result=connected
# смена текущего каталога перед записью лога
cd /var/log
echo `date +%Y.%m.%d__%H:%M:%S`' Run script ' >> ping.log
# бесконечный цикл
while [ true ]; do
        sleep 2
    errorscount="$(ping -c 2 -W 4 8.8.8.8 2<&1| grep -icE 'unknown|expired|unreachable|time out|100% packet loss')"
if [ "$errorscount" -eq 0 -a "$result" = connected ]; then
continue
fi
        if [ "$result" = disconnected -a "$send_sms" = 1 -a "$errorscount" != 0 ]; then
                echo `date +%Y.%m.%d__%H:%M:%S`' * Send SMS' >> ping.log && send_bad_msg
                send_sms=0
        fi
if [ "$result" = connected -a "$errorscount" != 0 ]; then
    result=disconnected
    echo `date +%Y.%m.%d__%H:%M:%S`' * connection break' >> ping.log
        sleep 20
    fi
    # если предыдущий пинг был неудачен, а текущий успешен, то
    if [ "$result" = disconnected -a "$errorscount" = 0 ]; then
    # запоминаем результат текущего пинга
    result=connected
        send_sms=1
    # и пишем в лог время установки соединения
    echo `date +%Y.%m.%d__%H:%M:%S`' connection restore' >> ping.log && send_good_msg
    fi
done

А вариант в виде правильного и красивого решения снова не осилил. Ну чтож, дорогу осилит идущий.

Aborigen1020 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.