2010-06-01 90 views

回答

15

不使用純Java。

最簡單的選擇是使用Runtime.exec()作爲外部進程運行kill -9 <pid>命令。

不幸的是,掌握PID並不那麼簡單。您需要使用反射黑魔法訪問private int pid字段,或者使用ps命令的輸出。

UPDATE - 實際上,還有另外一種方法。創建一個可以運行真正的外部應用程序的小工具(C程序,shell腳本,不管)。對實用程序進行編碼,以便它記住子進程的PID,併爲SIGTERM建立一個SIGKILL信號處理程序,它將SIGKILL子進程。

+0

我可以這樣做或在JNI中,雖然我不急於這樣做,你怎麼知道你想殺死的進程的PID? – ekeren 2010-06-01 14:12:15

+0

首先感謝這些回覆。反思和JNI/exec是我的最後手段,我想知道是否有人可以找到一個更優雅的方式來做到這一點。 – ekeren 2010-06-01 14:20:38

+0

我對包裝execution子手也很嚴厲,實際上我的老闆對此很難對待:)所以我明白,你知道這樣做沒有直接的方法。 – ekeren 2010-06-01 14:25:18

10

斯蒂芬他的回答是正確的。我寫的是什麼,他說:

public static int getUnixPID(Process process) throws Exception 
{ 
    System.out.println(process.getClass().getName()); 
    if (process.getClass().getName().equals("java.lang.UNIXProcess")) 
    { 
     Class cl = process.getClass(); 
     Field field = cl.getDeclaredField("pid"); 
     field.setAccessible(true); 
     Object pidObject = field.get(process); 
     return (Integer) pidObject; 
    } else 
    { 
     throw new IllegalArgumentException("Needs to be a UNIXProcess"); 
    } 
} 

public static int killUnixProcess(Process process) throws Exception 
{ 
    int pid = getUnixPID(process); 
    return Runtime.getRuntime().exec("kill " + pid).waitFor(); 
} 

您還可以得到PID這樣:

public static int getPID() { 
    String tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); 
    tmp = tmp.split("@")[0]; 
    return Integer.valueOf(tmp); 
} 
+0

在Linux上,我通過java(交互過程)運行命令:nslookup - >谷歌,這掛起了進程,我不能殺死這個過程。所以現在我用你的建議,但它不會終止這個過程,它只是掛起,我不能終止我的程序。我甚至試圖手動殺死PID但無濟於事,我該怎麼辦? – 2013-03-15 13:05:49

+0

@Space Rocker:一個簡單的kill會發送一個SIGTERM。 「kill -9」發送SIGKILL。嘗試「kill -9 -1」:它將SIGKILL發送到進程組中的所有進程,其中pid> 1。但這會起作用。 – 2013-04-09 23:48:51

+0

明確使用第二種方法來獲得自我PID。 VisualVM也是這樣。前一種方式是醜陋的黑客攻擊,它不是跨平臺的,並且可能在未來的Java版本中不起作用。 – Espinosa 2013-07-03 17:14:18

0

如果你知道進程名稱,你可以使用pkill

Runtime.getRuntime().exec("pkill firefox").waitFor(); 
1

由於Java 1.8

您可以調用方法destroyForcibly(),它調用destroy()會見默認情況下是hod,但根據Java文檔,所有由ProcessBuilderRuntime.exec()返回的子流程都實現此方法。

+1

不幸的是,目前的實現只是調用'destroy()'。看到這裏:https://bugs.openjdk.java.net/browse/JDK-8056139 – Joe 2016-01-26 15:33:22