Come posso eliminare i processi figlio Java quando la mia app Java si chiude / si arresta in modo anomalo?

StackOverflow https://stackoverflow.com/questions/261125

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

È stato utile?

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));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top