Linux

收到伺服器關閉信號後,守護程序必須退出多長時間?

  • July 19, 2020

當我們在 Linux 上開發一組複雜的服務時,我們開發了一個工具來逐個啟動它們。創建此類工具的眾多考慮因素之一是可以啟動項目的順序,但也是確保在守護程序死亡時,守護程序自動重新啟動的一種方法。還有在所有服務之間共享的伺服器範圍的參數。

但是,我現在有一個問題,關閉這樣的系統需要時間。關閉所有內容可能需要多達 10 秒的時間。

我想知道的是:下定義的腳本需要多長時間/etc/init.d/...才能關閉它控制的守護程序?

雖然我想如果我們將所有這些守護程序分解在單獨的包中(因為啟動腳本現在可以包含依賴項列表……),我們會遇到完全相同的問題。所以在這一點上,我們更喜歡保持原樣……

是否存在一個明確定義/已知的關閉時間,最多必須花費多少時間才能對所有守護程序保持優雅?

是否有一個明確定義/已知的最多關機時間?

不。

當我現在在執行 systemd 的系統上測試關閉各種守護程序時,我可以證明每個守護程序都明確定義了超時。

據我所知,它也適用於仍然使用 SysV 腳本啟動/停止的守護程序。當 Cassandra 仍在處理其文件時,執行 asystemctl restart cassandra將無法按預期工作。對於此類服務,您可能想要執行 asystemctl stop cassandra並且一旦您確定它已停止,執行systemctl start cassandra.

TimeoutStopSec所以…您可以在每個守護程序的基礎上定義/更改參數。這讓你有很大的粒度!

[Unit]
...
TimeoutStopSec=120

您可以更改系統預設值:(DefaultTimeoutStartSec這可能是不可取的……)

還有一個重要的時機,就是重啟功能(見最後一個連結)。非常重要,因為systemd預設要在100ms內重啟一個程序!!!因此,如果您的守護程序需要 2 分鐘才能關閉,它就無法正常工作……


對於那些感興趣的人,對於 Cassandra,我實際上首先執行了一個停止 Cassandra 的腳本。然後我繼續關機。

這可能需要 Cassandra 需要的時間(可能會很長),但它會徹底停止 Cassandra。請注意,以這種方式關閉可能感覺很長,但在重新啟動時,Cassandra 幾乎會立即準備就緒。

相比之下,快速關閉意味著殺死 Cassandra,並且在重新啟動時它必須返回其日誌,這實際上要長得多。所以這是一個很好的權衡。

引用自:https://serverfault.com/questions/776732