簡體   English   中英

Java中殺死進程的正確方法

[英]The right way to kill a process in Java

在 Java 中終止進程的最佳方法是什么?

獲取 PID 然后用Runtime.exec()殺死它?

使用destroyForcibly()

這兩種方法有什么區別,還有其他解決方案嗎?

如果您要殺死的進程已由您的應用程序啟動

然后你可能有一個引用它( ProcessBuilder.start()Runtime.exec()都返回一個引用)。 在這種情況下,您只需調用p.destroy() 我認為這是最干凈的方式(但要小心: p啟動的子流程可能會保持活躍狀態​​,請查看http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092獲取更多信息)。

只有在某個超時后destroy()失敗時才應使用destroyForcibly 簡而言之

  1. destroy()終止進程
  2. 允許進程在合理的超時時間內正常退出
  3. 如果進程仍然存在,則使用destroyForcibly()其殺死

如果要殺死的進程是外部的

那么你沒有太多選擇:你需要通過OS API( Runtime.exec )。 在Windows上,要調用的程序將是taskkill.exe ,而在Mac和Linux上,您可以嘗試kill


看看https://github.com/zeroturnaround/zt-exec/issues/19使用Javahttp://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app- 殺死一個進程 kill-any-process-after-specified-time-0133513 /獲取更多信息。

如果你試圖殺死java代碼啟動的主進程,我建議使用System.exit() 這里解釋了這些好處: 我們何時應該在java中調用system exit

從本質上講, System.exit()將運行關閉掛鈎,以確保在您的進程被終止之前,任何可能尚未完成其工作的從屬非守護進程被殺死。 這是干凈的方法。

如果該過程不屬於您,則必須依賴操作系統為您完成此工作,如本答案中所述: 使用Java殺死進程

在這種情況下,你建議Runtime.exec()殺死* nix將是一個不錯的方式。

現在和destroyForcibly() ,你通常會在你的java代碼生成的子進程上調用它,這個代碼可能是從進程api的ProcessBuilder.start()Runtime.exec()

Java 9 引入了公開.destroy().destroyForcibly()方法的ProcessHandle

長話短說

如果您知道進程 ID (pid),則使用“ .of ”:

ProcessHandle.of(pid).destroy();

否則采取以下步驟:

  1. 使用ProcessHandle.allProcesses()列出所有當前正在運行的進程
  2. .info()檢查它們
  3. 使用上面提到的destroy方法之一。

對我有用的是System.exit(0); 它的工作很好,因為它關閉了所有仍在運行的進程和組件

在java 8源代碼中

public Process destroyForcibly() {
    destroy();
    return this;
}

我只想說destroyForcibly等於Java 8中的destroy
因此,如果在調用destroy方法后進程仍處於活動狀態,則應嘗試使用pid終止進程。 如果你使用的是java 9 +,只需調用Process.pid()方法即可輕松獲取pid。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM