wie bekomme ich meine if-Anweisung richtig zum Laufen, der Antwortcode zeigt immer 1 und kommt nie aus der Schleife heraus

wie bekomme ich meine if-Anweisung richtig zum Laufen, der Antwortcode zeigt immer 1 und kommt nie aus der Schleife heraus

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 bytesund einen Antwortcode von gibt 0. Wenn es jedoch fehlschlägt, wird ein CheckHttp CRITICAL: 503Antwortcode 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.rbgibt einen Exit-Code von 0 (wahr) zurück

Übrigens habe ich keine Ahnung, was Ihre $LOG_FILEVariable 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

verwandte Informationen