ProcessBuilder를 bash는 리디렉션을 지원하지 않는 프로세스의 아이들을 죽이고, 그래서 실행하면 다음되지 않습니다Process.destroy는()
import java.lang.ProcessBuilder.Redirect;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String args[]) {
ProcessBuilder builder = new ProcessBuilder();
String command = "ping 127.0.0.1 > console.log";
builder.command("bash" , "-c", command);
//builder.redirectOutput(Redirect.appendTo(new File ("console.log")));
System.out.println("Builder: " + builder.command().toString());
try {
Process p = builder.start();
System.out.println("Sleeping for 20 seconds");
Thread.sleep(20000);
p.destroy();
} catch (Exception e) {
System.out.println("An error happened here");
}
}
가}
이p.destroy()는 부모 강타 사망 -c 프로세스는 있지만 자식은 처리하지 않습니다. 아이를 죽일 방법이 있습니까? ping은 파괴 된 후에도 계속 실행됩니다.
이 게시물 Java - Process.destroy() source code for Linux에 따르면, 결국 네이티브 C 코드 수준에서 아래로 죽일 호출합니다.
하지만 리눅스에서이 작업을 수행하는 경우에도 그것이 작동하지 않습니다
[[email protected]-VM01:~/tmp ]$ bash -c 'ping 127.0.0.1 > console.log' &
[1] 30914
[[email protected]:~/tmp ]$ ps
PID TTY TIME CMD
30536 pts/1 00:00:00 bash
30914 pts/1 00:00:00 bash
30915 pts/1 00:00:00 ping
30916 pts/1 00:00:00 ps
[[email protected]:~/tmp ]$ kill -9 30914
[[email protected]:~/tmp ]$ ps -ef | grep ping
john 30915 1 0 15:19 pts/1 00:00:00 ping 127.0.0.1
john 30919 30536 0 15:19 pts/1 00:00:00 grep ping
[1]+ Killed bash -c 'ping 127.0.0.1 > console.log'
[[email protected]:~/tmp ]$
ping이 계속 실행되고 ..