LINUX.ORG.RU

Поправить bash-скрипт.

 


0

2

Наколякал скрипт для сервака с двумя gw чтобы при падении первого переключаться на второй, а после «воскрешения» первого возращаться на него же.

Вот что получилось:

#!/bin/bash

GW1=0.0.0.0
DEF_INTERFACE=ppp0
GW2=192.168.1.1
SECOND_INTERFACE=eth1

while true
do
       if ping -I $DEF_INTERFACE -c5 8.8.8.8 | grep "100% packet loss" > /dev/null
        then
            ip route del default via $GW1 dev $DEF_INTERFACE
            ip route add default via $GW2 dev $SECOND_INTERFACE
        else
            if route | grep default | grep 192.168.1.1 > /dev/null
             then
                 ip route del default via $GW2 dev $SECOND_INTERFACE
                 ip route add default via $GW1 dev $DEF_INTERFACE
            fi
       fi

done


Всё работает отлично, но после первого переключения в консоль ползут сообщения вида:

RTNETLINK answers: No such process

RTNETLINK answers: File exists

То есть где-то не срабатывает условие-if? Попрошу не кидаться тапками, т.к bash ещё плохо знаю.

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

Вы не поверите, но даже совершенно пустой код while(true); должен жрать 100% CPU по определению. А у вас еще и route | grep ...

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

Ладно-ладно. Убрал я по максимуму жруще-дорогие операции и оставил только пинг до gw резервного провайдера + последующий его анализ на потерянные пакеты. Работает отлично и даже не знаю что в нём ещё улучшить. :)

https://github.com/FluffyPillow/AutoFailoverWAN

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

и даже не знаю что в нём ещё улучшить

Плохо, что не знаете.

Первое, что бросилось в глаза:

route | grep default | awk '{print $8}'
Сколько уже раз говорилось, что grep+awk — это смешно. Ну первое, что делает awk — это проверяет условие, а потом уже делает действия. Вы условие сделали «любое», но вынесли его в другую программу...
route -n | awk '$1=="0.0.0.0" {print $8; exit 0}'

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от FluffyPillow

Вместо


if [ ! -f $PING_COUNT_FILE ]; then touch $PING_COUNT_FILE; fi
if [ ! -f $PING_INTERVAL_MAX ]; then touch $PING_INTERVAL_MAX; fi

if [[ -z "$(cat $PING_COUNT_FILE)" ]]; then echo 20 > $PING_COUNT_FILE; fi
if [[ -z "$(cat $PING_INTERVAL_MAX)" ]]; then echo 0.2 > $PING_INTERVAL_MAX; fi


делаешь
if [ -f "$PING_COUNT_FILE" ]; then PING_COUNT=`cat "$PING_COUNT_FILE"` ; fi
echo $(PING_COUNT:=20) > "$PING_COUNT_FILE"
if [ -f "$PING_INTERVAL_FILE" ]; then PING_INTERVAL=`cat "$PING_INTERVAL_FILE"` ; fi
echo $(PING_INTERVAL:=0.2) > "$PING_INTERVAL_FILE"

и убираешь все эти $(cat ).

$(route | grep default | awk '{print $8}')


`ip ro sho match 0/0 | cut -d' ' -f5`


checking_ip=$(echo $checking_ip | grep -oP '\d+(?=% packet loss)')


checking_ip=$(checking_ip%\%*)
checking_ip=$(checking_ip##*, )

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