2011-05-13 43 views
7

Tengo un programa Java que ejecuta otro programa (Python) como un proceso.Terminar el proceso ejecutado con `exec` cuando el programa finaliza

Process p = Runtime.getRuntime().exec("program.py", envp); 

Si el procesado de acabado programa Java, Python el proceso está terminado así. El comando finish envía una señal al proceso de Python para cerrarlo.

En situación normal el proceso se cierra de esta manera:

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
output.write("@EOF\n"); 
output.flush(); 

Sin embargo, cuando se bloquea el programa Java, el proceso no es cerrado. El comando de cierre no se envía debido al bloqueo. ¿Es posible finalizar el proceso automáticamente cada vez que finaliza el programa?

+0

Estoy realmente interesado en la respuesta a esta pregunta también. Aunque no puedo ofrecerlo, ¿te importa compartir por qué tu programa Java está fallando? – Vinay

+1

Para que esta pregunta sea responsable, debe proporcionar más información. Por ejemplo: ¿puede modificar las fuentes de uno o ambos programas Java y Python? –

+0

Tendría que estar en desacuerdo con Vinay (jaja mismo nombre). De hecho, lo estoy buscando ahora mismo, pero creo que algo así como ejecutar ese proceso de python solo mientras se está ejecutando la actual identificación de proceso de Java sería el truco. No estoy seguro si estoy en el camino correcto, pero esta pregunta realmente me intriga. – Vinay

Respuesta

2

Suponiendo que al fallar significa que el programa Java arroja una excepción, simplemente mataría el proceso de Python cuando eso ocurra. No he visto el código, pero:

class Foo { 

    Process p; 

    private void doStuff() throws Exception { 
     p = Runtime.getRuntime().exec("program.py", envp); 
     // More code ... 
    } 

    private void startStuff() { 
     try { 
      doStuff(); 
     } catch (Exception e) { 
      p.destroy(); 
     } 
    } 

    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     foo.startStuff(); 
    } 
} 

Algo como esto debería funcionar si únicas excepciones que hacen que el programa se bloquee los escapes de doStuff().

Incluso si no espera que el programa se cuelgue de esta manera cuando está terminado, creo que este enfoque es mejor que tal vez envolverlo en un script de shell que de alguna manera mate el proceso de Python. Manejarlo en su programa es menos complejo e incluso podría ser una buena idea mantener el código una vez que el programa haya finalizado, ya que es posible que aún tenga errores que desconoce.

+0

Esta no es una solución perfecta, pero este patrón es suficiente en mi caso. – czuk

3

hey @czuk would a ShutdownHook hook any use? Esto se ocupará de los siguientes escenarios

La máquina virtual Java se cierra en respuesta a dos tipos de eventos:

  • El programa sale normalmente, cuando las últimas salidas de rosca no daemon o cuando la salida (equivalentemente, se invoca el método System.exit o

  • La máquina virtual finaliza en respuesta a una interrupción del usuario, como escribir^C, o un evento en todo el sistema, como cierre de sesión del usuario o apagado del sistema.

Cuando el sistema se bloquea inesperadamente esto no es tan fácil de capturar.

¿Quizás utilice el método Thread.setDefaultUncaughtExceptionHandler?

+2

"Los ganchos de apagado también deben finalizar su trabajo rápidamente. Cuando un programa invoca la salida, la máquina virtual se apagará y saldrá inmediatamente. Cuando la máquina virtual finaliza debido al cierre de sesión o al cierre del sistema, el sistema operativo subyacente solo puede permitir una cantidad fija de tiempo para cerrar y salir. Por lo tanto, no es aconsejable intentar ninguna interacción del usuario o realizar un cálculo de larga ejecución en un gancho de apagado ". La eliminación de un proceso de Python no lleva mucho tiempo. Parece la solución perfecta para el OP (y apaga mi interés). :) – Vinay

Cuestiones relacionadas