sirve que programacion para lenguaje historia filosofia descargar java jvm jruby webrick

java - que - ¿Cómo cierro limpiamente un JRuby incrustado en respuesta a un SIGTERM al proceso JVM?



ruby java (2)

Estoy ejecutando un servidor Middleman (que usa Webrick) en JRuby dentro de un proceso JVM usando la API org.jruby.embed.ScriptingContainer .

Si apago limpiamente y detengo el servidor desde la JVM, todo funciona como se espera.

Pero si envío un SIGTERM al proceso de JVM (por ejemplo, presionando ctrl + C en la línea de comandos), la consola regresa pero el proceso de JVM no finaliza, se cuelga indefinidamente hasta que le envío un SIGKILL.

Intenté registrar un enlace de cierre de JVM para finalizar la instancia de ScriptingContainer , pero el enlace nunca se dispara. No estoy seguro de por qué ... ¿quizás JRuby se esté tragando el SIGTERM de alguna manera?

¿Cómo puedo hacer que la JVM se cierre completamente, limpiamente, incluso si contiene un servidor Webrick en ejecución?


Parece que kill -9 no activa el shutdownHook, pero kill -15 hace.

Esta pregunta de tiene una respuesta detallada al mismo problema.

La conclusión es que estás jodido, ya que no parece existir ninguna forma de interceptar una señal de kill -9 y realizar algunas tareas de mantenimiento antes de que se detenga la JVM.


Primero, un truco de depuración: puede enviar un SIGQUIT a un proceso Java para que imprima los rastros actuales de la pila de todos los subprocesos en ejecución. Esto puede ayudarlo a diagnosticar qué subprocesos hacen que la JVM no se cierre.

El envío de un SIGINT , SIGHUP o SIGTERM hace que Java ejecute sus ganchos de apagado y luego salga. Puedes ver esto en java.lang.Terminator . Una vez que se recibe la señal, java.lang.Shutdown maneja todos los ganchos de apagado antes de terminar el proceso. No se llama a shutdown.halt Shutdown.halt() hasta después de que todos los ganchos de cierre hayan finalizado, lo que sugiere que tiene un gancho de cierre que está colgando.

Sin el código real o los seguimientos de la pila, es difícil proporcionar una respuesta más precisa que eso, pero una JVM que permanece activa después de enviar un SIGINT generalmente hace algo extraño en sus ganchos de apagado. Si esto no es suficiente para continuar, intente enviar un SIGINT , espere unos segundos, luego envíe un SIGQUIT y agregue los seguimientos de pila resultantes a la pregunta.