2008-12-17 22 views
25

Ich habe ein Skript, das nach dem Start von Tomcat ausgeführt werden muss und bereit ist, mit der Bereitstellung von Anwendungen zu beginnen. Ich verwende $TOMCAT_HOME/bin/startup.sh, die sofort zurückkehrt. Wie kann ich warten bis Tomcat fertig ist?Warten bis Tomcat fertig ist

Antwort

36

Es gibt wahrscheinlich mehrere Möglichkeiten, dies zu tun. Der Trick, den wir verwenden, ist:

#!/bin/bash 

until [ "`curl --silent --show-error --connect-timeout 1 -I http://localhost:8080 | grep 'Coyote'`" != "" ]; 
do 
    echo --- sleeping for 10 seconds 
    sleep 10 
done 

echo Tomcat is ready! 

Hoffe, das hilft!

+1

, wenn Sie verwenden z.B. grep '302 Found' statt grep 'Coyote', dann kann dies auch auf Nicht-Tomcat-Servern verwendet werden - z. um die Verfügbarkeit eines Jenkins-Servers zu überprüfen. – vorburger

+0

Noch besser: benutze 'curl --silent --write-out '% {response_code} -o/dev/null' [url] ''. Das gibt Ihnen den Antwortcode, und Sie können es mit '[' verwenden, um jeden Wert zu testen, den Sie für angemessen halten. Sie werden wahrscheinlich auch Weiterleitungen einschränken wollen. –

1

Hängt davon ab, was Sie mit dem Finishing meinen. Auf was willst du warten?

Sie könnten beispielsweise ein Skript verwenden, das eine URL wiederholt anspricht, bis ein wünschenswertes Ergebnis erzielt wird, das nur dann verfügbar ist, wenn die App ordnungsgemäß initialisiert wurde.

Sie könnten auch einen Context-Listener haben, der eine "Ich bin bereit" -Datei ausgibt, mit der Sie die Bereitschaft Ihrer Anwendung signalisieren. (Wenn Sie dies tun, stellen Sie sicher, dass die Datei nicht existiert, bevor Sie den App-Container starten).

0

Es gibt keine einfache Methode. Soweit es startup.sh und catalina.sh betrifft, läuft Tomcat, wenn sie fertig sind. Tomcat initialisiert und initialisiert intern noch Kontexte.

Es würde helfen wissen, ob Sie, wenn Ihr Kontext Laden oder wenn Sie nur ein allgemeines wollen fertig sind, um herauszufinden versuchen, „Tomcat runnnig obwohl Ihre Kontexte nicht vollständig geladen sein könnten ...“

Wenn es Letzteres ist, könnten Sie eine Web-App erstellen, die einfach einen Context-Listener hat, der ein Skript mit Runtime ausführt. Wenn Sie praktisch sind, können Sie die Webanwendung über die Datei web.xml konfigurieren, um einen Parameter zu akzeptieren, der auf das auszuführende Skript verweist.

0

Persönlich würde ich nur Catalinas Protokoll für eine bestimmte Zeichenfolge je nachdem, wie Ihre Einrichtung und welche genaue Phase Sie suchen.

+0

Sie meinen "watch" natürlich programmatisch. – OscarRyz

8

Es ist nicht schwer, programmatisch zu implementieren. Sie können org.apache.catalina.LifecycleListener implementieren und dann werden Sie

public void lifecycleEvent(LifecycleEvent lifecycleEvent) { 
      if(lifecycleEvent.getType().equals(Lifecycle.START_EVENT)) 
      //do what you want 
      }  
} 

in web.xml haben:

<Context path="/examples" ...> 
... 
<Listener className="com.mycompany.mypackage.MyListener" ... > 
... 
</Context> 

Bitte beachten Sie, dass einige Dinge zwischen 6-9 Tomcats unterscheiden.

+0

Scheint interessant. Was soll ich als nächstes mit dieser Klasse tun? Wie kann ich den Tomcat registrieren, wie kann dieser Code mit meinem Script/Ant kommunizieren? –

2

Suchen Sie noch nach einer Antwort? Es hängt von Ihrer Definition von gestartet ab. Wenn Ihre Definition von "Jetzt ist sicher zu stoppen" ist, sollten Sie überprüfen, ob der Port 8005 gehört.

0

Ich brauchte dies, um von jenkins zu testen, wenn der Tomcat vom Remote-Server für eine Systemprüfung gestartet wurde.

until [[ `ssh -o StrictHostKeyChecking=no [email protected]${DEPLOY_HOST} 'netstat -tulpn | grep 8005'` != "" ]] ; do echo "waiting for tomcat"; sleep 6; done

0

Ich habe es mit dem folgenden Code in jenkins pipelinescript mit tomcat getan. Bevor ich nenne nur

sudo /bin/systemctl restart tomcat 

und einen Eintrag in meiner sudoers-Datei für den Benutzer jenkins.

Jetzt ist hier die oneliner:

until [ "$(curl -w '%{response_code}' --no-keepalive -o /dev/null --connect-timeout 1 -u USERNAME:PASSWORD http://localhost:8080/manager/text/list)" == "200" ]; do echo --- sleeping for 1 second; sleep 1; done 

besser lesbar:

until [ "$(curl -w '%{response_code}' --no-keepalive -o /dev/null --connect-timeout 1 -u USERNAME:PASSWORD http://localhost:8080/manager/text/list)" == "200" ]; 
do echo --- sleeping for 1 second; 
sleep 1; 
done 
Verwandte Themen