Я пытаюсь проверить, успешно ли перезапущено приложение, у меня нет проблем с остановкой приложения, но есть проблемы с запуском приложения. Приложение запускается, но скрипт продолжает работать и никогда не выходит из цикла, когда сайт снова запускается.
У меня есть переменная $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