java - sistema - que es jvm en programacion
Genera un proceso en Java que sobrevive a un cierre de JVM (7)
Necesito engendrar un proceso en Java (exclusivamente en Linux) que continuará ejecutándose después de que la JVM haya salido. ¿Cómo puedo hacer esto?
Básicamente, la aplicación Java debe generar un actualizador que detiene la aplicación Java, actualiza los archivos y luego lo inicia nuevamente.
Me interesa un método de hack & slash para que funcione y una mejor propuesta de diseño si tienes uno :)
En realidad "solo funciona", a menos que intentes ser inteligente.
Mi envuelto java.lang.Process estaba tratando de capturar la salida del script, así que cuando la JVM murió, el script no tenía ningún lugar para enviar la salida por lo que simplemente se muere. Si no intento capturar la salida, o la secuencia de comandos no genera ninguna o redirige todo a un archivo o / dev / null, todo funciona como debería.
Pensé que el objetivo de Java era que estaba completamente contenido dentro de la JVM. Es un poco difícil ejecutar bytecode cuando no hay tiempo de ejecución.
Si está buscando un proceso totalmente independiente, podría intentar iniciar una segunda instancia de java.exe. Aunque para su aplicación, puede ser más fácil simplemente hacer un bloqueo sincronizado que detiene (pero no mata) su aplicación, realiza la actualización y luego reinicializa los datos de su aplicación.
Si está buscando hacer una actualización en Linux, probablemente esté ladrando al árbol equivocado. Creo que todas las principales distribuciones de linux tienen un administrador de paquetes integrado. Debería usar el administrador de paquetes para realizar su actualización. Nada me frustra más que los programas que intentan auto-actualizarse ... (Te estoy mirando, Eclipse)
Si está generando el proceso usando java.lang.Process
, debería "funcionar". No creo que el proceso generado muera cuando se cierre la JVM. Sin embargo, es posible que las bibliotecas Ant te ayuden a controlar el desove.
No siempre "solo funcionará". Cuando JVM engendra al niño y luego se apaga, el proceso secundario también se apagará en algunos casos. Ese es el comportamiento esperado del proceso. Bajo los sistemas WIN32, simplemente funciona.
Por ejemplo, si el servidor WebLogic se inició con un proceso Java, y luego ese proceso finaliza, también envía la señal de apagado al WebLogic a través de un gancho de cierre en JVM, lo que hace que WebLogic también se cierre.
Si "simplemente funciona" para usted, entonces no hay problema, sin embargo, si se encuentra en una posición de que el proceso hijo también se apaga con JVM, vale la pena echarle un vistazo al comando "nohup". El proceso no responderá a la señal SIGTERM, sino que responderá a la señal SIGKILL, así como a las operaciones normales.
Actualización: la forma descrita anteriormente es un poco exagerada. Otra forma de hacerlo sería usar "&" al final del comando. Esto generará un nuevo proceso que no es un elemento secundario del proceso actual de Java.
PD: Perdón por tantas actualizaciones, he estado aprendiendo y probándolo desde cero.
>> no creo que el proceso generado muera cuando la JVM se cierre.
El proceso hijo siempre está muriendo en mi caja (SuSE) cada vez que mato a Java. Creo que el proceso del niño morirá si se trata de E / S del proceso principal (es decir, java)
Estaba teniendo problemas con esto y el proceso de lanzamiento fue asesinado cuando se cerró la JVM.
Redirigir stdout y stderr a un archivo solucionó el problema. Supongo que el proceso estaba ligado a la aplicación java lanzada ya que de manera predeterminada esperaba pasarle su salida.
Aquí está el código que funcionó para mí (menos el manejo de excepciones):
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectOutput(logFile);
pb.redirectError(logFile);
Process p = pb.start();