Всем привет!
В академических целях занимаюсь велосипедостроением, поэтому не ищите много смысла в этом скрипте.
Нашел скрипт, который логирует недоступность заданного хоста и пишет об этом в лог. У меня есть 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
, а подсветки не появилось