在Linux中,當我運行java.lang.Process對象上的destroy函數(這是真正的類型化的java.lang.UNIXProcess)時,它發送一個SIGTERM信號處理,有沒有辦法用SIGKILL殺死它?我如何用SIGKILL殺死java進程中的Linux進程Process.destroy()做SIGTERM
回答
不使用純Java。
最簡單的選擇是使用Runtime.exec()
作爲外部進程運行kill -9 <pid>
命令。
不幸的是,掌握PID並不那麼簡單。您需要使用反射黑魔法訪問private int pid
字段,或者使用ps
命令的輸出。
UPDATE - 實際上,還有另外一種方法。創建一個可以運行真正的外部應用程序的小工具(C程序,shell腳本,不管)。對實用程序進行編碼,以便它記住子進程的PID,併爲SIGTERM建立一個SIGKILL信號處理程序,它將SIGKILL子進程。
斯蒂芬他的回答是正確的。我寫的是什麼,他說:
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);
}
在Linux上,我通過java(交互過程)運行命令:nslookup - >谷歌,這掛起了進程,我不能殺死這個過程。所以現在我用你的建議,但它不會終止這個過程,它只是掛起,我不能終止我的程序。我甚至試圖手動殺死PID但無濟於事,我該怎麼辦? – 2013-03-15 13:05:49
@Space Rocker:一個簡單的kill會發送一個SIGTERM。 「kill -9」發送SIGKILL。嘗試「kill -9 -1」:它將SIGKILL發送到進程組中的所有進程,其中pid> 1。但這會起作用。 – 2013-04-09 23:48:51
明確使用第二種方法來獲得自我PID。 VisualVM也是這樣。前一種方式是醜陋的黑客攻擊,它不是跨平臺的,並且可能在未來的Java版本中不起作用。 – Espinosa 2013-07-03 17:14:18
如果你知道進程名稱,你可以使用pkill
Runtime.getRuntime().exec("pkill firefox").waitFor();
由於Java 1.8
您可以調用方法destroyForcibly()
,它調用destroy()
會見默認情況下是hod,但根據Java文檔,所有由ProcessBuilder
或Runtime.exec()
返回的子流程都實現此方法。
不幸的是,目前的實現只是調用'destroy()'。看到這裏:https://bugs.openjdk.java.net/browse/JDK-8056139 – Joe 2016-01-26 15:33:22
- 1. 如何殺死Java中的進程process.destroy()
- 2. SIGKILL殺死進程
- 3. 無法殺死使用Process.destroy()的進程
- 4. 安全使用SIGTERM殺死postgres進程?
- 5. Java ProcessBuilder process.destroy()不殺死winXP中的子進程
- 6. 如何殺死Linux中沒有被殺死的進程
- 7. 殺死Linux進程剛跑
- 8. 殺死進程殺死其他進程
- 9. linux腳本殺死java進程
- 10. 用vbscript殺死Java進程
- 11. Linux - 如何殺死Kibana進程
- 12. 如何殺死STIME的一個Linux進程(dangling svnserve進程)
- 13. 如何殺死java中的進程啓動的子進程?
- 14. Linux中的自動殺死進程
- 15. 殺死進程
- 16. 殺死進程
- 17. 殺死進程
- 18. Java殺死Popup進程
- 19. 殺死java殭屍進程
- 20. 在linux中殺死一個進程
- 21. 在Linux中殺死殭屍進程
- 22. 如何殺死nohup進程?
- 23. 以Java編程的殺死進程
- 24. Vbscript中的殺死進程
- 25. 如何殺死Java LWP(輕量級進程)Linux
- 26. Android殺死進程
- 27. VB.NET - 殺死進程
- 28. 殺死進程SHELL
- 29. 殺死進程winword
- 30. 殺死mysqld進程
我可以這樣做或在JNI中,雖然我不急於這樣做,你怎麼知道你想殺死的進程的PID? – ekeren 2010-06-01 14:12:15
首先感謝這些回覆。反思和JNI/exec是我的最後手段,我想知道是否有人可以找到一個更優雅的方式來做到這一點。 – ekeren 2010-06-01 14:20:38
我對包裝execution子手也很嚴厲,實際上我的老闆對此很難對待:)所以我明白,你知道這樣做沒有直接的方法。 – ekeren 2010-06-01 14:25:18