¿Cómo me deshago de los procesos hijos de Java cuando mi aplicación Java se cierra/falla?
runtime subprocess (2)
Lanzo un proceso hijo en Java de la siguiente manera:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Ahora se ejecuta en segundo plano. Todo bien y bien.
Si mi programa ahora se cuelga (todavía está en dev :-)), el proceso hijo todavía parece estar suspendido. ¿Cómo puedo hacer que termine automáticamente cuando el proceso principal de Java muere?
Si ayuda, estoy usando Mac OS X 10.5
Ya lo resolví yo mismo. Agrego un gancho de cierre, de la siguiente manera:
final String[] cmd = {"<childProcessName>"};
final Process process = Runtime.getRuntime().exec(cmd);
Runnable runnable = new Runnable() {
public void run() {
process.destroy();
}
};
Runtime.getRuntime().addShutdownHook(new Thread(runnable));
Como dijiste, addShutdownHook es el camino a seguir.
PERO:
No hay garantía real de que sus ganchos de apagado se ejecuten si el programa finaliza. Alguien podría matar el proceso de Java y en ese caso su gancho de cierre no se ejecutará. (como se dice en esta pregunta SO )
algunas de las bibliotecas estándar tienen sus propios ganchos que pueden ejecutarse antes que los tuyos.
ten cuidado con los bloqueos.
Otra posibilidad sería envolver su programa Java en un servicio .