Ich versuche zu überprüfen, ob eine Anwendung erfolgreich neu gestartet wurde. Ich habe kein Problem damit, die Anwendung zu stoppen, aber Probleme beim Starten der App. Die App startet, aber das Skript läuft weiter und kommt nie aus der Schleife heraus, wenn die Site wieder verfügbar ist.
Ich habe eine Variable $aem_curl
, die ein anderes Skript ausführt und bei Erfolg das folgende Ergebnis anzeigt
CheckHttp OK: 200, found /crxde/ in 11038 bytes
und einen Antwortcode von gibt 0
. Wenn es jedoch fehlschlägt, wird ein CheckHttp CRITICAL: 503
Antwortcode von angezeigt2
Mein Code:
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
Meine Ausgabe:
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
Antwort1
Versuchen Sie es eher mit etwas wie diesem:
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
Die While-Schleife wird ausgeführt, bis entweder $count > $maxcountODER ./check-http-aem.rb
gibt einen Exit-Code von 0 (wahr) zurück
Übrigens habe ich keine Ahnung, was Ihre $LOG_FILE
Variable ist oder warum Sie manchmal Text hineinleiten, aber ein anderes Mal „$MESSAGE“ festlegen. Oder warum Sie keine Shell-Funktion anstelle einer Variablen verwenden. Oder ein vorhandenes Tool wie logger
. Es ist für die Frage nicht wirklich relevant, also werde ich einfach so tun, als würde es etwas auf stderr drucken und es ignorieren.
Auch...
Es ist besser, ein Array für Befehlsargumente zu verwenden, als sich darauf zu verlassen, dass die Shell eine Skalarvariable bei Leerzeichen aufteilt. Gehen Sie beispielsweise folgendermaßen vor:
aem_args=(-h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 3)
./check-http-aem.rb "${aem_args[@]}"
oder
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[@]}"
anstatt:
aem_curl="./check-http-aem.rb -h localhost -P 4502 -p /crx/de/index.jsp --response-code 200 -q 'crxde' -t 30"
$aem_curl
Diese machen im Wesentlichen alle dasselbe, aber bei letzterer ist es viel einfacher, Fehler zu machen und unerwartetes Verhalten zu erhalten. Sie können die letztere Form beispielsweise nicht verwenden, um Ihrem Skript einfach ein Argument zu übergeben, das ein Leerzeichen enthält, nicht ohne die IFS-Variable zu ändern, was andere, wahrscheinlich unerwünschte Folgen hätte. Aber mit einem Array ist das ganz einfach.
Mit anderen Worten könnten Sie Folgendes tun:
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