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

Не работает bash sleep

 , ,


0

1

Добрый день. Пишу скрипт, в котором если условие не истинно мне нужно, чтоб скрипт подождал какое-то время и повторил проверку условия снова и допустим уже на третий раз если условие не верно, выполнил команду. Если же условие истинно с первого раза продолжить выполнять иные команды. Пытался сделать таким образом:

x=1
y=2

        if [ "$x" -eq "$y" ]; then
           if [ $? -ne 0 ]; then
                sleep 25
           fi;
        if [ "$x" -eq "$y" ]; then
           if [ $? -ne 0 ]; then
                sleep 25
           fi;
        if [ "$x" -eq "$y" ]; then
                echo "Ok"
        else
                echo "No"
           fi;
        fi;
fi;
Но конечно это не работает. Честно говоря, я даже не могу представить каким путем это реализовать, нужен ли здесь будет цикл или задать какую-нибудь функцию... Надеюсь на вашу помощь, сильно не пинайте, я новичок)


Честно говоря, я даже не могу представить каким путем это реализовать

Пока НЕ условие И НЕ счетчик == 3 делай
    увеличить счетчик
    спать
PPP328 ★★★★★
()
Ответ на: комментарий от legolegs

Да, так оно и выходит) Опишу подробней, что мне нужно. Это скрипт опроса DNS-сервера, если что-то пошло не так, то скрипт должен прекратить анонсирование сервера, поскольку у него anycast'вый IP. Но я столкнулся с тем, что у меня переполнилась таблица netfiltr'a (nf_conntrack) и запросы по скрипту попали за пределы этой таблицы и дропнулись. Все необходимые работы по оптимизации сетевой нагрузки я провел и решил подстраховаться, что теперь в течение минуты он должен попытаться опросить хотя бы три раза прежде чем погасить демоны для anycast'a. Собственно, вот скрипт:

dnsup=$(dig @1.1.1.1 anycast +short)
mon=$(awk '/0.0/ {print$ 3}' /var/named/mon)
     if [ "$dnsup" != "$mon" ]; then
        systemctl stop bgp
        echo "Stopping Anycast"
     fi;
Так работает сейчас, но хотелось бы сделать, чтоб он предпринимал несколько попыток прежде чем останавливать демон. Или если с первого раза все ок, то продолжить дальше выполнение команд по скрипту.
Выше писали сделать через while с счетчиком итераций, но чет тоже не получается пока.

amkgi
() автор топика
Ответ на: комментарий от PPP328
while НЕ условие И НЕ счетчик == 3; do

по разному пытался, но не получается, можете подробней написать? Остальное то, что ниже конечно додумался, но с этим нет((

amkgi
() автор топика
Ответ на: комментарий от amkgi
dnsup=$(dig @1.1.1.1 anycast +short)
mon=$(awk '/0.0/ {print$ 3}' /var/named/mon)
c=0
while [ "$dnsup" != "$mon" ]; do
     if [ "$c" -eq "3" ]; then
        systemctl stop bgp
        echo "Stopping Anycast"
        exit 0
     fi
  sleep 10
  (( c++ ))
done
nerve ★★
()
Последнее исправление: nerve (всего исправлений: 2)
Ответ на: комментарий от nerve

Для варианта счетчика в цикле лучше поменять -eq на -ge, на всякий случай.

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

Большое спасибо! Это именно оно.

amkgi
() автор топика

А не работает из-за: if [ $? -ne 0 ]; then

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