taglibs standard pom net instalar impl artifactid java linux tomcat

java - standard - Espere hasta que Tomcat termine de comenzar



jstl maven (8)

Tengo un script que debe ejecutarse después de que tomcat haya terminado de iniciarse y está listo para comenzar a implementar aplicaciones. Estoy usando $TOMCAT_HOME/bin/startup.sh que regresa inmediatamente. ¿Cómo puedo esperar hasta que Tomcat haya terminado de comenzar?


¿Todavía estás buscando una respuesta? Depende de tu definición de iniciado. Si su definición de inicio es "Ahora es seguro detenerse", es posible que desee verificar si el puerto 8005 está escuchando.


Depende de lo que quieras decir al terminar. ¿Qué quieres esperar?

Podría, por ejemplo, tener un script que golpee una URL repetidamente hasta que obtenga un resultado deseable que solo estaría disponible una vez que la aplicación se haya inicializado correctamente.

También podría tener un oyente de contexto que escriba un archivo "Estoy listo" que use para indicar la disponibilidad de su aplicación. (Si hace esto, asegúrese de que el archivo no exista antes de iniciar el contenedor de la aplicación).


Lo he hecho con el siguiente código en jenkins pipelinescript con tomcat. Antes simplemente llamo

sudo /bin/systemctl restart tomcat

Y tenga una entrada en mi archivo sudoers para el usuario de jenkins.

Ahora aquí está el 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

Mejor legible:

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


Necesitaba esto para probar de jenkins si el tomcat del servidor remoto se inició para una comprobación del sistema.

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


No es difícil implementar programáticamente. Puede implementar org.apache.catalina.LifecycleListener y luego tendrá

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

en web.xml:

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

Tenga en cuenta que algunas cosas pueden variar entre 6-9 Tomcats.


No hay un método fácil. En lo que respecta a startup.sh y catalina.sh, tomcat se está ejecutando cuando terminen. Aunque, internamente, tomcat todavía se está inicializando y está comenzando contextos.

Ayudaría saber si estaba tratando de averiguar si su contexto terminó de cargarse o si solo quiere un general, "Tomcat está funcionando, aunque sus contextos podrían no estar completamente cargados ..."

Si es el último, podría crear una aplicación web que simplemente tenga un receptor de contexto que ejecutará un script usando Runtime. Si fueras útil, puedes hacer que la aplicación web sea configurable a través del archivo web.xml para aceptar un parámetro que apunte al script para su ejecución.


Personalmente, simplemente miro catalinas para buscar una cadena específica dependiendo de cómo se configura y qué fase exacta estás buscando.


Probablemente haya varias formas de hacer esto. El truco que usamos es:

#!/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!

¡Espero que esto ayude!