簡體   English   中英

Linux Shutdown和Java Shutdown Hook

[英]Linux Shutdown and Java Shutdown Hook

當我在后台運行Java進程並關閉計算機(ArchLinux)時,計算機是否會等待幾秒鍾以終止Java中的shutdown-hook?

如果你想在系統關閉時做一些事情,你需要添加一個shutdown-hook(假設你已經這樣做了):

Runtime.getRuntime().addShutdownHook(
new Thread(new Runnable() {
    @Override
    public void run() {
        // This method will be executed and Virtual Machine will close when this method will return
    }
}));

如果花費太多時間 ,系統將永遠不會等待完全終止

來自doc Runtime#addShutdownHook

當虛擬機因用戶注銷或系統關閉而終止時,底層操作系統可能只允許一段固定的時間來關閉和退出。 因此,不建議嘗試任何用戶交互或在關閉鈎子中執行長時間運行的計算。

您可以將Java程序包裝為服務,它將啟動並關閉操作系統。 最簡單的方法之一是使用spring boot框架

當關閉JVM的調用被調用時,將調用關閉鈎子。 但是,無法保證將調用掛鈎。 鈎子可能不會/不會運行:

  • 如果JVM因內部錯誤而崩潰。
  • 如果發出SIGKILL信號,或者在linux中殺死-9,在windows中殺死TerminateProcess。
  • Runtime.halt()還將阻止鈎子開始運行。
  • 拉動計算機電源(插頭處)。
  • 你的操作系統崩潰了。

當用戶關閉計算機時(而不是通過拉動插頭),計算機會向JVM發送一個關閉命令,該命令將執行關閉掛鈎,但是如果拔掉電源,計算機將沒有時間做任何事情,讓單獨向JVM發出命令。

我記得在某處讀過(但我再也找不到鏈接) - 它說一個關閉鈎子不應該花費很多時間來執行,或者當系統想要關閉時windows可能會殺死它。 這表示如果您決定通過操作系統關閉系統,將運行關閉掛鈎。

Tl; dr:這取決於直接拉動電源,或者如果操作系統崩潰,它們將無法運行。 正常的操作系統關閉將運行掛鈎,但操作系統可能會在完成之前關閉它們,如果它們花費的時間太長。


這是來自javadoc。

當虛擬機因用戶注銷或系統關閉而終止時,底層操作系統可能只允許一段固定的時間來關閉和退出。 因此,不建議嘗試任何用戶交互或在關閉鈎子中執行長時間運行的計算。

這表明當操作系統想要關閉時會掛起鈎子,但是建議它們不會花很長時間或者它們可能會被殺死。

暫無
暫無

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

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