usar sirve settitle que para codigo java process daemon

sirve - settitle java



¿Cómo demonizar un programa Java? (11)

Con frecuencia me encuentro escribiendo guiones o líneas de comandos que esencialmente se ven así, si quiero:

  1. Ejecute un programa que sea inmune a los suspiros
  2. Eso está completamente desconectado del caparazón que lo engendra, y
  3. Produce un archivo de registro de stderr y stdout cuyos contenidos se muestran también, pero
  4. Me permite dejar de ver el registro en progreso y hacer otras cosas sin interrumpir el proceso de ejecución

Disfrutar.

nohup java com.me.MyProgram </dev/null 2>&1 | tee logfile.log &

Tengo un programa Java que me gustaría demonizar en un sistema Linux. En otras palabras, quiero comenzar a ejecutarlo en un shell y hacer que continúe ejecutándose después de cerrar la sesión. También quiero poder detener el programa limpiamente.

Encontré este artículo que usa una combinación de scripts de shell y código de Java para hacer el truco. Se ve bien, pero me gustaría algo más simple, si es posible.

¿Cuál es su método preferido para demonizar un programa Java en un sistema Linux?


DaemonTools: - Una forma más limpia de administrar servicios en UNIX cr.yp.to/daemontools.html

  1. Instale las herramientas de daemon desde la URL https://cr.yp.to/daemontools/install.html siga las instrucciones mencionadas allí, para cualquier problema, por favor intente con las instrucciones https://gist.github.com/rizkyabdilah/8516303

  2. Cree un archivo en /etc/init/svscan.conf y agregue las siguientes líneas (solo se requiere para cent-os-6.7)

start on runlevel [12345] stop on runlevel [^12345] respawn exec /command/svscanboot

  1. Cree un nuevo script llamado run inside / service / vm / folder y agregue las siguientes líneas.

#!/bin/bash echo starting VM exec java -jar /root/learning-/daemon-java/vm.jar

Nota: reemplace el Jar con su propio archivo Jar. o cualquier archivo de clase java.

  1. Reinicia el sistema

  2. ¡svstat / service / vm debería estar funcionando ahora!

  3. ¡svc -d / service / vm debería bajar vm ahora!
  4. svc -u / service / vm debería traer VM ahora!


Eso depende. Si solo se trata de algo de una sola vez, quiero demonizarlo y luego irme a casa, pero generalmente espero los resultados, podría hacer:

nohup java com.me.MyProgram &

en la línea de comando. Para matarlo limpiamente, tienes muchas opciones. Es posible que tenga un oyente para SIGKILL, o escuche en un puerto y cierre cuando se establece una conexión, revise periódicamente un archivo. Los enfoques de diferencia tienen diferentes debilidades. Si es para uso en producción, lo pensaría más, y probablemente lanzaría un script en /etc/init.d que no lo haga, y tendría un apagado más sofisticado, como lo que tiene Tomcat.


Mi forma preferida en Ubuntu es usar la utilidad libslack ''daemon''. Esto es lo que Jenkins usa en Ubuntu (que es de donde saqué la idea). Lo he usado para mis aplicaciones de servidor basadas en Jetty y funciona bien.

Cuando detenga el proceso del daemon, indicará a la JVM que se apague. Puede ejecutar el código de cierre / limpieza en este punto registrando un gancho de cierre con Runtime.addShutdownHook ().


Prefiero el comando nohup . La publicación del blog dice que hay mejores formas, pero no creo que sean lo suficientemente mejores.


Puede probar Java Service Wrapper , la edición de comunidad es gratuita y satisface sus necesidades.


Si no puede confiar en Java Service Wrapper citado en elsewhere (por ejemplo, si está ejecutando en Ubuntu, que no tiene una versión empaquetada de SW), probablemente quiera hacerlo a la antigua: haga que su programa escriba su PID en / var / run / $ progname.pid, y escribe una secuencia de comandos SysV init (por ejemplo, una para ntpd como ejemplo, es simple) a su alrededor. Preferiblemente, también sea compatible con LSB.

Básicamente, la función de inicio prueba si el programa ya se está ejecutando (probando si /var/run/$progname.pid existe, y el contenido de ese archivo es el PID de un proceso en ejecución), y si no se ejecuta

logfile=/var/log/$progname.log pidfile=/var/run/$progname.pid nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1

La función de detención comprueba en /var/run/$progname.pid, comprueba si ese archivo es el PID de un proceso en ejecución, verifica que sea una VM Java (para no matar un proceso que simplemente reutilizó el PID de un muerto instancia de mi daemon Java) y luego mata ese proceso.

Cuando se llame, mi método main () comenzará escribiendo su PID en el archivo definido en System.getProperty ("pidfile").

Un gran obstáculo, sin embargo: en Java, no hay una forma simple y estándar para obtener el PID del proceso en el que se ejecuta la JVM.

Esto es lo que se me ocurrió:

private static String getPid() { File proc_self = new File("/proc/self"); if(proc_self.exists()) try { return proc_self.getCanonicalFile().getName(); } catch(Exception e) { /// Continue on fall-back } File bash = new File("/bin/bash"); if(bash.exists()) { ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID"); try { Process p = pb.start(); BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream())); return rd.readLine(); } catch(IOException e) { return String.valueOf(Thread.currentThread().getId()); } } // This is a cop-out to return something when we don''t have BASH return String.valueOf(Thread.currentThread().getId()); }



This pregunta se trata de demonizar un programa arbitrario (no específico de Java) por lo que algunas de las respuestas se pueden aplicar a su caso: