Como faço para me livrar de processos filho Java quando meus saídas de aplicativos Java / trava?
-
06-07-2019 - |
Pergunta
eu lançar um processo filho em Java da seguinte forma:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Agora é executado em segundo plano. Tudo de bom e multa.
Se o meu programa agora cai (ele é ainda em dev :-)) o processo filho ainda parece pendurar ao redor. Como posso fazer isso automaticamente termina quando o processo dies pai Java?
Se ajudar, eu estou usando o Mac OS X 10.5
Solução
Como você disse, addShutdownHook é o caminho a percorrer.
MAS:
-
Não há nenhuma garantia real de que seus ganchos de desligamento são executados se os termina programa. Alguém poderia matar o processo de Java e, nesse caso, o seu gancho de desligamento não será executada. (Como referido neste SO questão )
-
algumas das bibliotecas padrão têm seus próprios ganchos que pode funcionar antes de seu.
-
cuidado de impasses.
Outra possibilidade seria envolver seu programa java em um serviço.
Outras dicas
Eu trabalhei-lo eu mesmo já. Eu adicionar um gancho de desligamento, conforme a seguir:
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));