как заставить мой оператор if работать правильно, код ответа всегда показывает 1 и никогда не выходит из цикла

как заставить мой оператор if работать правильно, код ответа всегда показывает 1 и никогда не выходит из цикла

Я пытаюсь проверить, успешно ли перезапущено приложение, у меня нет проблем с остановкой приложения, но есть проблемы с запуском приложения. Приложение запускается, но скрипт продолжает работать и никогда не выходит из цикла, когда сайт снова запускается.

У меня есть переменная $aem_curl, которая запускает другой скрипт и отображает следующий результат, если он успешен, CheckHttp OK: 200, found /crxde/ in 11038 bytesи выдает код ответа 0. Но если он терпит неудачу, он отображает CheckHttp CRITICAL: 503код ответа2

Мой код:

aem_curl="./check-http-aem.rb -h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 30"
STOP_TMOUT=15
echo "starting $AEM_APP this will take a few mins..." | ${LOG_FILE}
    sudo $restart_aem start
    count=0
    while true; do
      echo "Waiting for AEM to start try #${count} ..." | ${LOG_FILE}

        $aem_curl

     if [ $? -eq 0 ]; then
        echo "AEM has started! status code - $?" | ${LOG_FILE} && break
     else
        echo "AEM has not started yet - status code is $?" | ${LOG_FILE}
     fi
      if [ "$count" -eq "${STOP_TMOUT}" ]; then
              MESSAGE="Already waited 10 minutes for AEM start something is amiss." | ${LOG_FILE}
              exit 1
      fi
      count=$(($count+1))
      sleep 20
    done

Мой вывод:

Waiting for AEM to start try #0 ...
CheckHttp CRITICAL: Request error: Failed to open TCP connection to localhost:4502 (Connection refused - connect(2) for "localhost" port 4502)
AEM has not started yet - status code is 1
Waiting for AEM to start try #1 ...
CheckHttp CRITICAL: 503
AEM has not started yet - status code is 1
Waiting for AEM to start try #2 ...
CheckHttp CRITICAL: 503
...
Waiting for AEM to start try #19 ...
CheckHttp CRITICAL: 200, did not find /'crxde'/ in 11038 bytes: <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=8"/><title>CRXDE Lite</title><link rel="shortcut icon" href="icons/crxde_favicon.ico"><link type="image/...
AEM has not started yet - status code is 1
Waiting for AEM to start try #20 ...
CheckHttp CRITICAL: 200, did not find /'crxde'/ in 11038 bytes: <!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=8"/><title>CRXDE Lite</title><link rel="shortcut icon" href="icons/crxde_favicon.ico"><link type="image/...
AEM has not started yet - status code is 1

решение1

Попробуйте что-нибудь вроде этого:

maxcount=15
count=0
while [ "$count" -lt "$maxcount" ] && ! ./check-http-aem.rb -h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 30; do
 ...
 sleep 20
 let count+=1
done

if [ "$count" -eq "$maxcount" ] ; then
  echo "AEM hasn't started" >/dev/stderr
  exit 1
fi

Цикл while будет выполняться до тех пор, пока $count > $maxcountИЛИ ./check-http-aem.rbвозвращает код выхода 0 (истина)

Кстати, я понятия не имею, что это за $LOG_FILEпеременная или почему вы иногда передаете в нее текст, а в другой раз устанавливаете "$MESSAGE". Или почему вы не используете функцию оболочки вместо переменной. Или существующий инструмент вроде logger. Это не имеет отношения к вопросу, поэтому я просто сделаю вид, что она что-то выводит в stderr, и проигнорирую это.


Также...

Лучше использовать массив для хранения аргументов команды, чем полагаться на оболочку для разделения скалярной переменной по пробелам. Например, сделайте так:

aem_args=(-h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 3)
./check-http-aem.rb "${aem_args[@]}"

или

aem_curl=./check-http-aem.rb
aem_args=(-h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 3)
$aem_curl "${aem_args[@]}"

вместо:

aem_curl="./check-http-aem.rb -h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 30"
$aem_curl

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

Другими словами, вы можете сделать следующее:

maxcount=15
count=0
aem_args=(-h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 3)

while [ "$count" -lt "$maxcount" ] && ! ./check-http-aem.rb "${aem_args[@]}"; do
 ...
 sleep 20
 let count+=1
done

Связанный контент