2010-10-14 3 views
2

Depuis mon programme, j'appelle un processus Linux, je lis la sortie de ce processus, je le traite et je dors jusqu'à la prochaine itération. Le problème que j'ai est que le processus que j'appelle ne meurt pas toujours, même quand je fais un childProcess.destroy(). Voici le code:Problèmes de suppression du processus enfant invoqués en Java

while(true) { 
    Process childProcess = Runtime.getRuntime().exec("./getData"); 
    InputStream input = childProcess.getInputStream(); 
    BufferedReader inPipe = new BufferedReader(new InputStreamReader(input)); 
    while((lineRead = inPipe.readLine()) != null) { 
     // do stuff 
    } 
childProcess.destroy(); 
inPipe.close(); 
input.close(); 
} 

La grande majorité du temps, ./getData court, sort avec grâce et mon programme fonctionne comme il se doit. Mais .... parfois, il ne sort pas et reste juste là consommant CPU. J'ai besoin d'un moyen de le tuer. J'ai aussi essayé d'ajouter avant que je l'invoquons, mais cela ne fonctionne pas:

Process killGetData = Runtime.getRuntime().exec("pkill -9 getData"); 
killGetData.destroy(); 

Je devine que je suis peut-être être coincé dans la boucle en interne().

Toutes pensées, idées et astuces reçues avec gratitude. Un grand merci à l'avance

John

Répondre

1

Vous devez fermer le tuyau d'entrée - le processus de l'enfant d'y mettre fin. Ajouter

childProcess.getOutputStream().close(); 

(c'est un flux de sortie pour le processus parent mais l'entrée pour l'enfant).

[EDIT] N'oubliez pas d'appeler le childProcess.waitFor() pour nettoyer le processus zombie.

+0

Salut Aaron, d'abord - merci pour la réponse. Pouvez-vous expliquer cela plus en détail s'il vous plaît? J'ai regardé de nombreux exemples de ce que j'essaie de faire et ils disent tous à peu près la même chose. Comment utiliser getOutputStream? Désolé pour la question stupide mais je suis encore tout à fait nouveau à tout cela – Wilko

+0

Désolé, j'ai oublié le ".close()" :-) Le problème est que le processus fils lit à partir de stdin (== flux de sortie du parent). Il se terminera lorsque le flux sera fermé. N'oubliez pas d'appeler "waitFor()". Cela nettoiera le processus s'il est devenu un processus "zombie". –

+0

Merci encore pour votre réponse Aaron. Je vais donner un coup de pouce :) – Wilko

Questions connexes