2013-07-21 4 views
3

В приведенном ниже фрагменте кода, если я уничтожаю Process p с использованием p.destroy(), процесс 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

Этот ответ ** НЕ ** правильный. Пожалуйста, проверьте [javadoc] (http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook-java.lang.Thread-) класса 'Runtime'. Этот код очистит порожденные процессы только тогда, когда JVM будет закрыт изящно. – zloster

Смежные вопросы