檢視原始碼 heart (核心 v10.2)

Erlang 執行時系統的心跳監控。

此模組包含與 heart 程序互動的介面。heart 會定期向一個外部埠程式發送心跳訊號,該埠程式也名為 heartheart 埠程式的目的是檢查它所監管的 Erlang 執行時系統是否仍在運行。 如果埠程式在 HEART_BEAT_TIMEOUT 秒內(預設為 60 秒)沒有收到任何心跳訊號,則系統可能會重新啟動。

要由 heart 程式監控的 Erlang 執行時系統,需要使用命令列標誌 -heart 啟動(另請參閱 erl(1))。 然後會自動啟動 heart 程序。

% erl -heart ...

如果系統因心跳訊號遺失或 Erlang 執行時系統終止而重新啟動,則必須在啟動系統之前設定環境變數 HEART_COMMAND。 如果未設定此變數,則會印出警告文字,但系統不會重新啟動。

若要在 Windows 上重新啟動,HEART_COMMAND 可以設定為 heart -shutdown(包含在 Erlang 發行版中)或任何其他可以啟動重新啟動的合適程式。

環境變數 HEART_BEAT_TIMEOUT 可以用於設定 heart 的逾時時間;可以在啟動 Erlang 之前在作業系統 shell 中設定,也可以在命令列中指定

% erl -heart -env HEART_BEAT_TIMEOUT 30 ...

該值(以秒為單位)必須在 10 < X <= 65535 的範圍內。

當在缺少單調時間支援的作業系統上執行時,heart 容易受到超過 HEART_BEAT_TIMEOUT 秒的系統時鐘調整的影響。 發生這種情況時,heart 會逾時並嘗試重新啟動系統。 例如,如果使用網路時間協定 (NTP) 自動調整系統時鐘,則可能會發生這種情況。

如果發生崩潰,除非設定了環境變數 ERL_CRASH_DUMP_SECONDS,否則不會寫入 erl_crash.dump

% erl -heart -env ERL_CRASH_DUMP_SECONDS 10 ...

如果需要常規的 core dump,請透過使用環境變數 HEART_KILL_SIGNAL=SIGABRT 將 kill 訊號設定為中止來告知 heart。 如果未設定或未設定為 SIGABRT,則預設行為是使用 SIGKILL 的 kill 訊號。

% erl -heart -env HEART_KILL_SIGNAL SIGABRT ...

如果 heart 應該 kill Erlang 執行時系統,可以使用環境變數 HEART_NO_KILL=TRUE 來指示。 如果 heart 執行的命令負責處理此問題,例如作為特定清除順序的一部分,這會很有用。 如果未設定或未設定為 TRUE,則預設行為將是如上所述進行 kill。

% erl -heart -env HEART_NO_KILL 1 ...

此外,ERL_CRASH_DUMP_SECONDSheart 上具有以下行為

  • ERL_CRASH_DUMP_SECONDS=0 - 完全抑制寫入 crash dump 檔案,從而立即重新啟動執行時系統。 這與不設定環境變數相同。

  • ERL_CRASH_DUMP_SECONDS=-1 - 將環境變數設定為負值,除非 crash dump 檔案完全寫入,否則不會重新啟動執行時系統。

  • ERL_CRASH_DUMP_SECONDS=S - heart 會等待 S 秒,以便寫入 crash dump 檔案。 S 秒後,無論是否寫入 crash dump 檔案,heart 都會重新啟動執行時系統。

在以下說明中,如果未啟動 heart,所有函式都會因 badarg 的原因而失敗。

摘要

函式

在心跳訊號之前移除驗證回呼呼叫。

清除臨時啟動命令。 如果系統終止,則會使用正常的 HEART_COMMAND 重新啟動。

取得驗證回呼。 如果回呼已清除,則會傳回 none

取得臨時重新啟動命令。 如果命令已清除,則會傳回空字串。

傳回 {ok, Options},其中 Options 是目前為 heart 啟用的選項清單。 如果回呼已清除,則會傳回 none

此驗證回呼會在將任何心跳訊號傳送到埠程式之前執行。 為了使驗證成功,它需要傳回值 ok

設定臨時重新啟動命令。 如果要使用環境變數指定的 HEART_COMMAND 以外的其他 HEART_COMMAND 來重新啟動系統,則會使用此命令。 新的 Erlang 執行時系統會使用(如果它行為不當)環境變數 HEART_COMMAND 來重新啟動。

set_options 的有效選項為

類型

連結到此類型

heart_option()

檢視原始碼 (未匯出)
-type heart_option() :: check_schedulers.

函式

連結到此函式

clear_callback()

檢視原始碼 (自 OTP 18.3 起)
-spec clear_callback() -> ok.

在心跳訊號之前移除驗證回呼呼叫。

-spec clear_cmd() -> ok.

清除臨時啟動命令。 如果系統終止,則會使用正常的 HEART_COMMAND 重新啟動。

連結到此函式

get_callback()

檢視原始碼 (自 OTP 18.3 起)
-spec get_callback() -> {ok, {Module, Function}} | none when Module :: atom(), Function :: atom().

取得驗證回呼。 如果回呼已清除,則會傳回 none

-spec get_cmd() -> {ok, Cmd} when Cmd :: string().

取得臨時重新啟動命令。 如果命令已清除,則會傳回空字串。

連結到此函式

get_options()

檢視原始碼 (自 OTP 18.3 起)
-spec get_options() -> {ok, Options} | none when Options :: [atom()].

傳回 {ok, Options},其中 Options 是目前為 heart 啟用的選項清單。 如果回呼已清除,則會傳回 none

連結到此函式

set_callback(Module, Function)

檢視原始碼 (自 OTP 18.3 起)
-spec set_callback(Module, Function) -> ok | {error, {bad_callback, {Module, Function}}}
                      when Module :: atom(), Function :: atom().

此驗證回呼會在將任何心跳訊號傳送到埠程式之前執行。 為了使驗證成功,它需要傳回值 ok

回呼中的例外狀況會被視為驗證失敗。

如果系統重新啟動,則會移除回呼。

-spec set_cmd(Cmd) -> ok | {error, {bad_cmd, Cmd}} when Cmd :: string().

設定臨時重新啟動命令。 如果要使用環境變數指定的 HEART_COMMAND 以外的其他 HEART_COMMAND 來重新啟動系統,則會使用此命令。 新的 Erlang 執行時系統會使用(如果它行為不當)環境變數 HEART_COMMAND 來重新啟動。

限制:命令字串 Cmd 會以 ISO Latin-1 或 UTF-8 編碼的二進位形式傳送到 heart 程式,具體取決於模擬器的檔案名稱編碼模式(請參閱 file:native_name_encoding/0)。 編碼後的二進位大小必須小於 2047 個位元組。

連結到此函式

set_options(Options)

檢視原始碼 (自 OTP 18.3 起)
-spec set_options(Options) -> ok | {error, {bad_options, Options}} when Options :: [heart_option()].

set_options 的有效選項為

  • check_schedulers - 如果啟用,將會向每個排程器發送訊號以檢查其回應能力。 系統檢查會在傳送任何心跳訊號到埠程式之前發生。 如果任何排程器反應不夠快,heart 程式將不會收到其心跳訊號,因此最終會終止節點。

如果選項有效,則傳回值 ok