Проверка условия в цикле

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Проверка условия в цикле

Сообщение bars »

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

Код: Выделить всё

#!/bin/sh
STAT=`php /usr/local/www/serv.php --status`
if [ "$STAT" = "ACTIVE" ]
then
echo $STAT
fi
exit 0
Не пойму как лучше сделать, не убиваемый цикл не хочется городить это не к чему, но как сделать цикл закрывается когда верный статус.
Последний раз редактировалось bars 26.03.2021 18:21, всего редактировалось 2 раза.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Статусы.
php /usr/local/www/serv.php --status
SHELVED_OFFLOADED

php /usr/local/www/serv.php --status
ACTIVE
Добавлено (18:26):
Проверку сделать каждые 15 минут до получения верного статуса.
думаю что то в этом роде
while ["$STAT" = "ACTIVE"]; do
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

При каком статусе бекапить-то?

Код: Выделить всё

while [ "$(php /usr/local/www/serv.php --status)" != "$STATUS_READY" ]; do
    sleep $TIMEOUT
done

do_backup
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
26.03.2021 18:47
При каком статусе бекапить-то?
ACTIVE.
И сколько он в таком случае проверок сможет сделать?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

bars писал:
26.03.2021 18:49
И сколько он в таком случае проверок сможет сделать?
Сколько понадобится, столько и сделает. Пока не дождётся нужного статуса.
Добавлено (19:00):
Но учтите, что там гонка будет, TOCTOU. Между проверкой и началом бекапа статус ведь измениться может. И, по закону Мерфи, рано или поздно такое случится.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
26.03.2021 18:57
Но учтите, что там гонка будет, TOCTOU. Между проверкой и началом бекапа статус ведь измениться может. И, по закону Мерфи, рано или поздно такое случится.
Не понял.
Структуру такая.
Запускается по крону каждый день, проверка статуса, статус не найдет проверка через 15-20 минут, статус найдет заливка бэкапа и завершение выполнения.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

bars писал:
26.03.2021 19:19
Не понял.
wikipedia://TOCTOU
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
26.03.2021 18:57
Но учтите, что там гонка будет, TOCTOU. Между проверкой и началом бекапа статус ведь измениться может. И, по закону Мерфи, рано или поздно такое случится.
То-есть если допустим совпадение найдется по условию и начнется выполнятся заливка бэкапа, в процессе заливки бэкапа продолжится проверка условия while и получится что двойная/тройная заливка бэкапа, то-есть выполнение по условию может дублироваться?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Проверка условия в цикле

Сообщение ormorph »

bars писал:
27.03.2021 07:15
То-есть если допустим совпадение найдется по условию и начнется выполнятся заливка бэкапа, в процессе заливки бэкапа продолжится проверка условия while и получится что двойная/тройная заливка бэкапа, то-есть выполнение по условию может дублироваться?
Нет, пока не отработает тело цикла, условие не будет проверяться по новой. Тут скорее всего имеется в виду то, что в процессе заливки бэкапа, сервис может стать неактивным и как результат можно получить на выходе мусор. Тут уж зависит от того, как у вас это организованно...
Хотя у вас привязано к cron, по этому и такое может случиться.
Не знаю почему нельзя было сделать все это на php, там есть свои таймеры, так что можно было написать свой демон. А так можно ещё добавить проверку запущен ли скрипт бекапа.
Последний раз редактировалось ormorph 27.03.2021 08:40, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

ormorph писал(а):
27.03.2021 08:25
Нет, пока не отработает тело цикла, условие не будет проверяться по новой. Тут скорее всего имеется в виду то, что в процессе заливки бэкапа, сервис может стать неактивным и как результат можно получить на выходе мусор. Тут уж зависит от того, как у вас это организованно...
скрипт пока выгляди так.
В нем сначало происходит запуск сервиса, сервис не быстро поднимается в течении 1-2 часа, для этого и нужна проверка по времени.
далее если статус верный в условии цикла, то выполняется само условие, заливка бэкапа и после сервис у которого проверяли статус закрыть.

Код: Выделить всё

#!/bin/sh
# Запуск сервиса
/usr/local/bin/php /usr/local/www/serv.php --unshelve
# Получаем статус сервиса.
STAT=`/usr/local/bin/php /usr/local/www/serv.php --status`
# проверка статуса
while [ "$STAT" != "ACTIVE" ]
do
# если статус не верный то спим 20 минут
    /bin/sleep 1200
done
# если статус верный то выполняем задание
    /bin/echo "тестовое письмо, мой статус $STAT." | mail -s "Тестовое письмо" taram@ya.ru
# отключаем сервис.
    /usr/local/bin/php /usr/local/www/serv.php --shelve
# Закрытия скрипта.    
exit 0
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Проверка условия в цикле

Сообщение ormorph »

Выше дописал, у вас привязка к cron, по этому может получится что скрипт будет запущен несколько раз.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

ormorph писал(а):
27.03.2021 08:48
Выше дописал, у вас привязка к cron, по этому может получится что скрипт будет запущен несколько раз.
Хмм, ну так по крону раз в сутки будет запуск.
Заливка бэкапа окало часа занимает.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Проверка условия в цикле

Сообщение ormorph »

Н
bars писал:
27.03.2021 08:56
Хмм, ну так по крону раз в сутки будет запуск.
Заливка бэкапа окало часа занимает.
Ну а сколько раз должен производиться бэкап? Один раз при запуске скрипта?
Тут много непонятно, у вас бэкап запускается по получению письма? Или это просто тестовое письмо, для отладки скрипта.
Ну и у вас в скрипте команда проверки статуса выполняется только один раз, по этому так работать не будет.
Можно изменить строчки:

Код: Выделить всё

STAT=`/usr/local/bin/php /usr/local/www/serv.php --status`
на:

Код: Выделить всё

STAT="/usr/local/bin/php /usr/local/www/serv.php --status"
в цикле:

Код: Выделить всё

while [ "$STAT" != "ACTIVE" ]
заменить на:

Код: Выделить всё

while [ "$($STAT)" != "ACTIVE" ]
Тогда проверка будет повторяться много раз.
А так у вас получился бесконечный цикл, в котором условие всегда равно true.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Бэкап разумеется один раз в сутки должен проходить.
Пока я отлаживаю скрипт и сделал просто отправку письма на почту себе.
После, отправку письма заменю на заливку бэкапа на сервер.
А что изменилось в цикле?
Вы добавили экранироване.
Бесконечный цикл разумеется мне не нужен, что бы он все время выполнялся.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Проверка условия в цикле

Сообщение ormorph »

bars писал:
27.03.2021 09:30
А что изменилось в цикле?
В цикле теперь при каждой проверке условия выполняется команда записанная в переменную STAT и ее вывод проверяется в условии. Ну а у вас команда выполнялась один раз при инициализации переменной, и после этого ее вывод(который больше не менялся) постоянно проверялся в условии цикла. Данный пример должен работать только в bash. Можно попробовать заменить конструкцию $() на ``.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

А что это "$($STAT)" делает?
У меня просто не bash, а csh.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Проверка условия в цикле

Сообщение ormorph »

bars писал:
27.03.2021 10:46
А что это "$($STAT)" делает?
У меня просто не bash, а csh.
Тоже самое что и ``, выполняет команду записанную текстом.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

bars писал:
27.03.2021 07:15
То-есть если допустим совпадение найдется по условию и начнется выполнятся заливка бэкапа, в процессе заливки бэкапа продолжится проверка условия while и получится что двойная/тройная заливка бэкапа, то-есть выполнение по условию может дублироваться?
Нет, while тут ни при чём, дело в самом принципе. В скрипте Вы последовательно проверяете состояние сервиса, после чего запускаете бекап. В момент между проверкой и запуском бекапа состояние может успеть измениться. Чем это чревато — Вам виднее.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Привет.
Подскажите.
Есть скрипт, он как то не корректно работает.
Скрипт запускается каждый день по крону в одно время.
Преждевременно выполняет команды, а не по очереди.
Бывает выполнит команду с начало /usr/local/bin/php /usr/local/www/serv.php --shelve и просто весит как активный.
Разумеется бэкап не заливается, так как сервер бэкапов становится не активный.
Если запустить вручную сервер /usr/local/bin/php /usr/local/www/serv.php --unshelve, то скрипт продолжает заливку бэкапа от предыдущего раза.
Как его лучше сделать?
Странно как то.

Код: Выделить всё

#!/bin/sh
STAT="/usr/local/bin/php /usr/local/www/serv.php --status"
DT=`date +"%d-%m-%Y"`
DT_YESTERDAY=`date -v-1d +"%d-%m-%Y"`
 
/usr/local/bin/php /usr/local/www/serv.php --unshelve
 
/bin/sleep 2400
 
while [ "$($STAT)" != "ACTIVE" ]
do
    /bin/sleep 600
done
    /bin/echo "Начало загрузка бэкапа на сервер ${DT}, статус облако "$($STAT)"." | mail -s "Начало загрузка бэкапа в облако ${DT}." bars@local
 
    /usr/bin/ssh -p 22 root@1.1.1.1 rm -rf /mnt/backup/fil/$DT_YESTERDAY
    /usr/bin/ssh -p 22 root@1.1.1.1 rm -rf /mnt/backup/sql/$DT_YESTERDAY
 
    /usr/bin/scp -r -P 22 /mnt/backup/fil/${DT} root@1.1.1.1:/mnt/backup/fil/
    /usr/bin/scp -r -P 22 /mnt/backup/sql/${DT} root@1.1.1.1:/mnt/backup/sql/
 
    /bin/echo "Конец загрузки бэкапа на сервер ${DT}, статус облако "$($STAT)"." | mail -s "Конец загрузки бэкапа в облако ${DT}." bars@local
 
    /usr/local/bin/php /usr/local/www/serv.php --shelve
exit 0
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
beliYaguar
Сообщения: 24

Re: Проверка условия в цикле

Сообщение beliYaguar »

Странный какой-то сервер, который в случайном порядке открывает временное окно для бэкапа. Я бы не стал работать с таким сервером.
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Этот бэкап впска в облаке ovh
Если эта впска свернута на полку (не активна), то за нее деньги не берутся.
впска как дешевый резервный вариант, если продакшен сайт падет, то переключаемся на впску.
Вот из-за этого и чехарда со статусами, включения отключения самой впски.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
beliYaguar
Сообщения: 24

Re: Проверка условия в цикле

Сообщение beliYaguar »

bars писал:
08.04.2021 11:43
Если эта впска свернута на полку (не активна), то за нее деньги не берутся.
Как-то всё.... Вы платите деньги и вам не могут его включить в определённое время... :ohmy:
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

А Вы уверены, что это не несколько экземпляров скрипта, запущенные в разные дни, разом начинают работать?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
08.04.2021 13:49
А Вы уверены, что это не несколько экземпляров скрипта, запущенные в разные дни, разом начинают работать?
Скорее всего.
Но тогда почему предыдущий скрипт вчерашний не закрылся?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

Потому что так и не дождался статуса ACTIVE.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
08.04.2021 16:34
Потому что так и не дождался статуса ACTIVE.
Странно что не дождался статуса актив.
А можно как то ограничение поставить, к примеру 20 проверок и закрытия скрипта.
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

Добавьте счётчик. Перед циклом в цикле

Код: Выделить всё

i=$((i+1))
[ $i -eq 20 ] && exit
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
08.04.2021 17:38
i=$((i+1))
[ $i -eq 20 ] && exit
А с каким интервалом проверка будет запускаться?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Проверка условия в цикле

Сообщение Bizdelnick »

bars писал:
08.04.2021 18:12
А с каким интервалом проверка будет запускаться?
В смысле? На каждой итерации цикла. Раз у Вас там sleep 600, значит раз в 10 минут.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
bars
Сообщения: 917
ОС: BSD/LINUX
Контактная информация:

Re: Проверка условия в цикле

Сообщение bars »

Bizdelnick писал:
08.04.2021 18:27
В смысле? На каждой итерации цикла. Раз у Вас там sleep 600, значит раз в 10 минут.
Ясно, спасибо за помощь.
Что посоветуете в плане оптимизации скрипта, что бы не было нюансов загрузки?
Настройка BSD систем
Знание сила, незнание Рабочая сила!
Спасибо сказали:
Ответить