在下面的代碼片段中,如果我使用p.destroy()
銷燬Process p
,只有進程p
(即cmd.exe
)正在被破壞。但不是它的小孩iperf.exe
。如何用Java終止這個過程。如何殺死java中的進程啓動的子進程?
Process p= Runtime.getRuntime().exec("cmd /c iperf -s > testresult.txt");
在下面的代碼片段中,如果我使用p.destroy()
銷燬Process p
,只有進程p
(即cmd.exe
)正在被破壞。但不是它的小孩iperf.exe
。如何用Java終止這個過程。如何殺死java中的進程啓動的子進程?
Process p= Runtime.getRuntime().exec("cmd /c iperf -s > testresult.txt");
在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()
根據您的需要將工作。
您應使用此代碼來代替:
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);
這段代碼也不會精確地工作,但你只需要一點點的流撥弄。
但我需要銷燬子進程(iperf)。怎麼做?任何想法? –
只要'p.destroy()'。我分離了cmd.exe和iperf,所以iperf會在'p.destroy()'中被殺死。 – tbodt
你可以參考下面的代碼片段:
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 ");
}
});
}
}
這個答案是**不正確。請檢查'Runtime'類的[javadoc](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#addShutdownHook-java.lang.Thread-)。只有在JVM正常關閉時,此代碼纔會清理生成的進程。 – zloster
不要使用'的Runtime.exec()',用'ProcessBuilder' – fge
讓主進程等待子進程 p.waitFor() ; p.destroy(); 然後終止所有 – user1283633