2010-01-29 6 views
1

mon code va comme ceci:processus tuant java après une période de temps

 Runtime rt = Runtime.getRuntime(); 
     // cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
     Process proc = rt.exec(cmd); 

Maintenant, je veux tuer ce processus après une seconde, et obtenir sa sortie et l'erreur dans une des variables de chaîne.

Comment faire?

Dans mon cas: J'ai une boucle infinitive dans la classe compilée Sth. Je commence et ensuite, après une seconde, je veux le tuer.

// Je le teste sur Win XP puis sur Debian.

thx Tzim

Répondre

3

Ce sera un peu délicat, car une fois que vous terminez le processus, sa sortie est plus disponible, donc vous devez saisir la sortie avant de le tuer.

Thread.sleep(1000); 
InputStream in = proc.getInputStream(); 
byte[] data = new byte[in.available()]; 
in.read(data); 
proc.destroy(); 

Cela suppose que le processus ne se ferme pas dans l'intervalle. Si tel est le cas, InputStream ne sera pas disponible et vous souhaiterez avoir lu les données au lieu de tourner les pouces.

Vous voudrez certainement rendre cette exception sûre - mettre l'appel à proc.destroy dans un gestionnaire finally pour s'assurer que le processus enfant se termine.

+0

Et si le processus se fermer avant le 1 sec? – tzim

+0

Et apparemment je me suis fait pas clair. Votre code ne ferme pas mon application. Dans mon exemple, nous parlons de boucle infinitive dans la classe Sth. Donc, après une seconde, il y a toujours un Sth qui mange mon CPU. – tzim

+1

@tzim L'appel à 'proc.destroy' va le tuer. Si le processus peut se fermer, vous devez saisir la sortie en temps réel, au lieu de tout à la fin. Mais puisque vous avez dit qu'il y a une boucle infinie, cela ne devrait pas poser de problème. –

3
Runtime rt = Runtime.getRuntime(); 
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
Process proc = rt.exec(cmd); 

(Vous avez une faute de frappe dans votre cmd, vous avez écrit "= Xms2M" au lieu de "-Xms2M", même pour "-Xmx16M").

N'appelez jamais Runtime.exec comme ça: vous devez diviser votre 'cmd' dans un tableau ou vous rencontrerez beaucoup de problèmes. Faites comme ceci:

String[] sar = { "cmd.exe", "/C", "java", "-Xms2M", "-Xmx16M", "Sth" }; 
Runtime.getRuntime().exec(sar); 
+0

Merci, mon cmd est un tableau de cordes il était juste une simplification. – tzim

1

Cela pourrait aussi vous aider:

private static String runCommand(boolean debug, String... script) throws IOException, InterruptedException { 
    Runtime rt = Runtime.getRuntime(); 
    Process process = rt.exec(script); 
    BufferedReader reader = null; 
    try { 
     reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StreamReaderUtil.UTF8)); 
     Thread.sleep(1000); 
     StringBuilder queryExe = new StringBuilder(); 
     try { 
      String str; 
      while(reader.ready() && (str = reader.readLine()) != null) { 
       queryExe.append(str).append("\n"); 
      } 
     } catch(IllegalThreadStateException e) { 
      Thread.sleep(250); 
     } 
     // FIXME: Replace with a Logger 
     if(debug) { 
      System.out.println("Executing : " + script); 
      System.out.println("Result : " + queryExe); 
     } 
     return queryExe.toString(); 
    } finally { 
     if(process != null) { 
      process.destroy(); 
     } 
     if(reader != null) { 
      reader.close(); 
     } 
    } 
} 
Questions connexes