Добрый вечер.
пишу скрипт бэкапа.
В нем есть пункт проверка статуса приложения, он должен отловить один параметр, если параметр верный то продолжить заливку бэкапа, если нет то пробовать через определенное время, до получения нужного статуса и в конце закрыться.
И сколько он в таком случае проверок сможет сделать?
Сколько понадобится, столько и сделает. Пока не дождётся нужного статуса.
Добавлено (19:00):
Но учтите, что там гонка будет, TOCTOU. Между проверкой и началом бекапа статус ведь измениться может. И, по закону Мерфи, рано или поздно такое случится.
Но учтите, что там гонка будет, TOCTOU. Между проверкой и началом бекапа статус ведь измениться может. И, по закону Мерфи, рано или поздно такое случится.
Не понял.
Структуру такая.
Запускается по крону каждый день, проверка статуса, статус не найдет проверка через 15-20 минут, статус найдет заливка бэкапа и завершение выполнения.
Но учтите, что там гонка будет, TOCTOU. Между проверкой и началом бекапа статус ведь измениться может. И, по закону Мерфи, рано или поздно такое случится.
То-есть если допустим совпадение найдется по условию и начнется выполнятся заливка бэкапа, в процессе заливки бэкапа продолжится проверка условия while и получится что двойная/тройная заливка бэкапа, то-есть выполнение по условию может дублироваться?
То-есть если допустим совпадение найдется по условию и начнется выполнятся заливка бэкапа, в процессе заливки бэкапа продолжится проверка условия while и получится что двойная/тройная заливка бэкапа, то-есть выполнение по условию может дублироваться?
Нет, пока не отработает тело цикла, условие не будет проверяться по новой. Тут скорее всего имеется в виду то, что в процессе заливки бэкапа, сервис может стать неактивным и как результат можно получить на выходе мусор. Тут уж зависит от того, как у вас это организованно...
Хотя у вас привязано к cron, по этому и такое может случиться.
Не знаю почему нельзя было сделать все это на php, там есть свои таймеры, так что можно было написать свой демон. А так можно ещё добавить проверку запущен ли скрипт бекапа.
Последний раз редактировалось ormorph 27.03.2021 08:40, всего редактировалось 1 раз.
Нет, пока не отработает тело цикла, условие не будет проверяться по новой. Тут скорее всего имеется в виду то, что в процессе заливки бэкапа, сервис может стать неактивным и как результат можно получить на выходе мусор. Тут уж зависит от того, как у вас это организованно...
скрипт пока выгляди так.
В нем сначало происходит запуск сервиса, сервис не быстро поднимается в течении 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
Хмм, ну так по крону раз в сутки будет запуск.
Заливка бэкапа окало часа занимает.
Ну а сколько раз должен производиться бэкап? Один раз при запуске скрипта?
Тут много непонятно, у вас бэкап запускается по получению письма? Или это просто тестовое письмо, для отладки скрипта.
Ну и у вас в скрипте команда проверки статуса выполняется только один раз, по этому так работать не будет.
Можно изменить строчки:
Бэкап разумеется один раз в сутки должен проходить.
Пока я отлаживаю скрипт и сделал просто отправку письма на почту себе.
После, отправку письма заменю на заливку бэкапа на сервер.
А что изменилось в цикле?
Вы добавили экранироване.
Бесконечный цикл разумеется мне не нужен, что бы он все время выполнялся.
В цикле теперь при каждой проверке условия выполняется команда записанная в переменную STAT и ее вывод проверяется в условии. Ну а у вас команда выполнялась один раз при инициализации переменной, и после этого ее вывод(который больше не менялся) постоянно проверялся в условии цикла. Данный пример должен работать только в bash. Можно попробовать заменить конструкцию $() на ``.
То-есть если допустим совпадение найдется по условию и начнется выполнятся заливка бэкапа, в процессе заливки бэкапа продолжится проверка условия while и получится что двойная/тройная заливка бэкапа, то-есть выполнение по условию может дублироваться?
Нет, while тут ни при чём, дело в самом принципе. В скрипте Вы последовательно проверяете состояние сервиса, после чего запускаете бекап. В момент между проверкой и запуском бекапа состояние может успеть измениться. Чем это чревато — Вам виднее.
Привет.
Подскажите.
Есть скрипт, он как то не корректно работает.
Скрипт запускается каждый день по крону в одно время.
Преждевременно выполняет команды, а не по очереди.
Бывает выполнит команду с начало /usr/local/bin/php /usr/local/www/serv.php --shelve и просто весит как активный.
Разумеется бэкап не заливается, так как сервер бэкапов становится не активный.
Если запустить вручную сервер /usr/local/bin/php /usr/local/www/serv.php --unshelve, то скрипт продолжает заливку бэкапа от предыдущего раза.
Как его лучше сделать?
Странно как то.
Этот бэкап впска в облаке ovh
Если эта впска свернута на полку (не активна), то за нее деньги не берутся.
впска как дешевый резервный вариант, если продакшен сайт падет, то переключаемся на впску.
Вот из-за этого и чехарда со статусами, включения отключения самой впски.