Доброго дня!
Недавно столкнулся с задачей ротации каналов связи, суть в том, что есть основной канал связи, есть резервный. Реальная задача, из реальной жизни, а так навеяло студенческими годами.
Приступим к делу? Задача реализовать переключение канала связи на резервный, при падении основного канала. Но при этом всем необходимо учесть возможность возврата к основному каналу (при его восстановлении).
Как говорится, глаза бояться, руки делают.
В основу метода лег стек. Скрипт запускается по Крону с заданным интервалом времени (у нас это 1 минута). При каждом запуске в определенный файл (пусть это будет file.txt), в его конец, добавляется состояние основного канала.
Условно: 1 — работает, 0-не работает.
Чтобы не раздувать наш файл, оставим в файле последние пять состояний, все остальные удалим (по факту будет удаляться одно первое состояние).
Чтобы не мучить пользователя постоянными переключениями каналов, принимаем за правило: переключать канал, только в том случае, когда ошибка повторилась 5 раз подряд.
Вот уже вырисовывается алгоритм (простите, я принадлежу клану староверов, то этому и алгоритм рисую прежним стандартом).
С алгоритмом разобрались. Пробежимся по основным и наиболее интересным командам.
Функция получения статуса канала (пинг канала), в случае успеха вернет 1, иначе 0
function pingrun
{
STATUS=`ping $1 -c 1 -w 2 | grep " 1 received"`
if [[ -z "$STATUS" ]]; then
echo 0
else
echo 1
fi
}
Для удаления верхней строки файла используйте следующий код
tail -n -6 "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename";
Ну а полный код данного скрипта, можно взять здесь.
Автор: человек со стажем