2011-10-20 31 views
17

Tengo una aplicación Java que crea un proceso externo y lee el proceso 'stdout a través de un InputStream. Necesito poder matar el proceso cuando haya terminado con él. ¿Hay alguna manera de enviar una señal SIGINT a este proceso? (como si hubiera presionado Ctrl + C desde la consola).¿Cómo enviar la señal SIGINT de Java a un proceso externo?

El proceso externo no es mi código y no puedo modificarlo.

Respuesta

2

¿Está ejecutando el programa externo como java.lang.Process? Como la clase Process tiene un método destroy().

+8

Parece que envía una señal SIGTERM, no SIGINT. Consulte esta pregunta aquí: http://stackoverflow.com/questions/2950338/how-can-i-kill-a-linux-process-in-java-with-sigkill-process-destroy-does-sigte –

13

¿Se puede enviar kill -SIGINT <pid> al proceso (dado que se conoce el ID del proceso):

Runtime.getRuntime().exec("kill -SIGINT 12345"); 

Por supuesto, que haría para una solución dependiente de la plataforma ... Potencialmente, usted será capaz de para usar esta herramienta, aunque está en "modo de espacio aislado". Pero puede ser que le dan una idea:

http://commons.apache.org/sandbox/runtime/

Ver también esta pregunta relacionada aquí:

how can I kill a Linux process in java with SIGKILL Process.destroy() does SIGTERM

+2

No existe una solución independiente de la plataforma como [Windows no tiene señales] (http://stackoverflow.com/questions/140111/sending-an-arbitrary-signal-in-windows). –

+0

@fix_moeller: supongo que tienes razón. Pero tal vez hay una biblioteca que proporciona algún tipo de abstracción, al menos para matar a otros procesos ... –

+0

@Lukas Eder, tengo una pregunta, si abro este proceso en un nuevo hilo, y luego digamos que está ahorcado, etc. Lo mato usando SIGINT en Linux (de otro hilo), básicamente mata todo mi programa java, ¿hay alguna posibilidad de que solo este proceso en particular muera mientras mi programa todavía se está ejecutando ???? –

2

Por desgracia no es una forma nativa para enviar una señal de arbirtray en Java.

Estoy de acuerdo con Lukas en el uso de Runtime.exec() o puede utilizar algo como la biblioteca Posix for Java.

3

Para otras personas que llegan aquí desde Google si desea enviar la señal al Proceso actual (también conocido como JVM), puede utilizar el método sun.misc.Signal.raise(). Personalmente lo necesito debido a una biblioteca JNI que estoy usando.

+0

Eso no parece enviar una señal real, solo llame al manejador de señal. O? – dkagedal

+0

@Jason Axelson También estoy usando sun.misc.Signal.raise (nueva señal ("TERM")); estoy inicializando un componente JNI que sigue funcionando y nunca se detiene, eve n mis otros hilos están detenidos. así que estoy usando esta solución para cerrar mi aplicación. – vijayashankard

Cuestiones relacionadas