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!