Come posso eliminare i processi figlio Java quando la mia app Java si chiude / si arresta in modo anomalo?
-
06-07-2019 - |
Domanda
Avvio un processo figlio in Java come segue:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Ora viene eseguito in background. Tutto bene e bene.
Se ora il mio programma si arresta in modo anomalo (è è ancora in sviluppo :-)) il processo figlio sembra ancora bloccarsi. Come posso farlo terminare automaticamente quando il processo Java padre termina?
Se aiuta, sto usando Mac OS X 10.5
Soluzione
Come hai detto, addShutdownHook è la strada da percorrere.
MA:
-
Non vi è alcuna reale garanzia che i tuoi hook di arresto vengano eseguiti se il programma termina. Qualcuno potrebbe interrompere il processo Java e in tal caso il tuo hook di spegnimento non verrà eseguito. (come detto in questa domanda SO )
-
alcune delle librerie standard hanno i loro hook che possono essere eseguiti prima dei tuoi.
-
attenzione ai deadlock.
Un'altra possibilità potrebbe essere avvolgere il tuo programma java in un servizio .
Altri suggerimenti
L'ho già capito da solo. Aggiungo un hook di spegnimento, come segue:
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));