que por pasa jdk instalar desinstalo desinstalar completo java linux service daemon

por - ¿Qué debería escuchar un programa Java para ser un buen servicio de Linux?



que pasa si desinstalo java (2)

En Linux puedes dar los siguientes comandos:

service <someService> start service <someService> stop

A diferencia de matar el proceso con kill -9 <someService> . Como aprendí en una pregunta anterior, esta es la diferencia entre enviar al proceso un SIGTERM (antiguo) y un SIGKILL (último).

Entonces, ¿cómo se hace para "registrar" (y codificar) un JAR o WAR ordinario como un servicio / demonio que se puede iniciar y detener con esos comandos? Me imagino que Java debe tener alguna API para manejar SIGTERM s?

¡Gracias por adelantado!


No puede definir manejadores de señales para diferentes señales en Java puro, como lo haría en un programa nativo de Unix. Esto significa que no puede seguir las convenciones comunes de, por ejemplo, que el programa vuelva a cargar su configuración en SIGHUP y realice un cierre limpio en SIGINT o SIGTERM .

Lo que puedes hacer es definir un gancho de apagado . Se ejecutan cuando la máquina virtual se apaga, por ejemplo, después de recibir SIGTERM . Aquí hay un ejemplo:

Runnable myShutdownHook = new Runnable() { void run() { System.out.println("I''m melting! What a world..."); } }; Runtime.getRuntime().addShutdownHook(new Thread(myShutdownHook));


Si solo desea ejecutar algún código específico de apagado, la forma "adecuada de Java" de manejar esto no usaría señales, sino que agregaría un "gancho de apagado" genérico que se ejecutaría cuando su aplicación estuviera a punto de finalizar. Este es uno de los problemas de denominador menos común que algunas veces sufre Java. (Dado que no todas las plataformas admiten SIGINT , en Java, ninguna plataforma admite SIGINT ).

Desafortunadamente, no obtienes mucho contexto en un ShutdownHook , pero aún puede ser útil:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { // cleanup } }));

Si realmente necesita distinguir entre la señal recibida, o si desea admitir señales que Java normalmente ignora (como USR1 ), o si desea cancelar el apagado basado en una señal, entonces un ShutdownHook será inútil para usted.

Existe una forma no compatible y mal documentada de capturar señales en Sun JVM, utilizando la clase sun.misc.SignalHandler . Esto es cuestionable, aunque parece que la IBM JVM también es compatible con esto .

Por ejemplo, puede conectar un controlador de señal para escuchar SIGHUP cargar la configuración de su servidor, que se configuró en el script init.d como el verbo de init.d :

Signal.handle(new Signal("HUP"), new SignalHandler() { public void handle(Signal signal) { reloadConfiguration(); } });

En cuanto a la configuración de una aplicación Java para controlar con el comando del system , debe escribir un script de shell en el programa init.d que lo inicie. Esto simplemente necesita responder a los verbos de start y finalización y tomar la acción apropiada. Por ejemplo, este podría ser su /etc/init.d/my-java-program :

#!/bin/sh case "$1" in start) java /path/to/my/java/program.jar & echo $! > /var/run/my-java-program.pid ;; stop) if [ ! -f /var/run/my-java-program.pid ]; then echo "my-java-program: not running" exit 1 fi kill -TERM `cat /var/run/my-java-program.pid` ;; reload) if [ ! -f /var/run/my-java-program.pid ]; then echo "my-java-program: not running" exit 1 fi kill -HUP `cat /var/run/my-java-program.pid` ;; *) echo "Usage: /etc/init.d/my-java-program {start|stop|reload}" exit 1 ;; esac exit 0

Ahora puede iniciar su aplicación ejecutando /etc/init.d/my-java-program start , o en CentOS, también puede usar el servicio my-java-program start`.