¿Cómo me deshago de los procesos secundarios Java cuando mi aplicación Java se cierra / cierra?
-
06-07-2019 - |
Pregunta
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 falla ( está todavía en dev :-)), el proceso secundario todavía parece quedarse. ¿Cómo puedo hacer que finalice automáticamente cuando el proceso Java principal muere?
Si ayuda, estoy usando Mac OS X 10.5
Solución
Como dijiste, addShutdownHook es el camino a seguir.
PERO:
-
No existe una 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 no se ejecutará su gancho de apagado. (como se dice en esta pregunta SO )
-
algunas de las bibliotecas estándar tienen sus propios ganchos que pueden ejecutarse antes que los suyos.
-
cuidado con los puntos muertos.
Otra posibilidad sería envolver su programa Java en un servicio .
Otros consejos
Ya lo resolví yo mismo. Agrego un gancho de apagado, 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));