2013-07-21 160 views
3

在下面的代碼片段中,如果我使用p.destroy()銷燬Process p,只有進程p(即cmd.exe)正在被破壞。但不是它的小孩iperf.exe。如何用Java終止這個過程。如何殺死java中的進程啓動的子進程?

Process p= Runtime.getRuntime().exec("cmd /c iperf -s > testresult.txt"); 
+1

不要使用'的Runtime.exec()',用'ProcessBuilder' – fge

+1

讓主進程等待子進程 p.waitFor() ; p.destroy(); 然後終止所有 – user1283633

回答

3

在Java 7中ProcessBuilder可以爲你做重定向,所以只需直接運行iperf而不是通過cmd.exe

ProcessBuilder pb = new ProcessBuilder("iperf", "-s"); 
pb.redirectOutput(new File("testresult.txt")); 
Process p = pb.start(); 

產生的p現在是iText的本身,所以destroy()根據您的需要將工作。

1

您應使用此代碼來代替:

Process p= Runtime.getRuntime().exec("iperf -s"); 
InputStream in = p.getInputStream(); 
FileOutputStream out = new FileOutputStream("testresult.txt"); 
byte[] bytes; 
in.read(bytes); 
out.write(bytes); 

這段代碼也不會精確地工作,但你只需要一點點的流撥弄。

+0

但我需要銷燬子進程(iperf)。怎麼做?任何想法? –

+1

只要'p.destroy()'。我分離了cmd.exe和iperf,所以iperf會在'p.destroy()'中被殺死。 – tbodt

-1

你可以參考下面的代碼片段:

public class Test { 

public static void main(String args[]) throws Exception { 


    final Process process = Runtime.getRuntime().exec("notepad.exe"); 

     //if killed abnormally (For Example using ^C from cmd) 
     Runtime.getRuntime().addShutdownHook(new Thread() { 

      @Override 
      public void run() { 

       process.destroy(); 
       System.out.println(" notepad killed "); 
      } 


     }); 





} 
} 
+0

這個答案是**不正確。請檢查'Runtime'類的[javadoc](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook-java.lang.Thread-)。只有在JVM正常關閉時,此代碼纔會清理生成的進程。 – zloster