2016-06-16 4 views
0

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이 계속 실행되고 ..

답변

1

그것은 포크와 간부가 자식 프로세스를 시작 않습니다 bash처럼 보인다, 그래서 아이는 죽지 않을 것이다. 대신 bashksh를 사용하는 경우, 당신은 간부없이 포크를 얻을 것이다 :

ksh -c ping 127.0.0.1 > console.log

내가 모르는 ksh, process.destroy() 죽이는 KSH 모두와 자식 프로세스를 사용하여 하지만 확실히, kshbash 모두에 대한 man 페이지에서 -c 옵션은 매우 유사합니다.