檢視原始碼 heart (核心 v10.2)
Erlang 執行時系統的心跳監控。
此模組包含與 heart
程序互動的介面。heart
會定期向一個外部埠程式發送心跳訊號,該埠程式也名為 heart
。 heart
埠程式的目的是檢查它所監管的 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_SECONDS
在 heart
上具有以下行為
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
的有效選項為
類型
函式
-spec clear_callback() -> ok.
在心跳訊號之前移除驗證回呼呼叫。
-spec clear_cmd() -> ok.
清除臨時啟動命令。 如果系統終止,則會使用正常的 HEART_COMMAND
重新啟動。
取得驗證回呼。 如果回呼已清除,則會傳回 none
。
-spec get_cmd() -> {ok, Cmd} when Cmd :: string().
取得臨時重新啟動命令。 如果命令已清除,則會傳回空字串。
-spec get_options() -> {ok, Options} | none when Options :: [atom()].
傳回 {ok, Options}
,其中 Options
是目前為 heart 啟用的選項清單。 如果回呼已清除,則會傳回 none
。
-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 個位元組。
-spec set_options(Options) -> ok | {error, {bad_options, Options}} when Options :: [heart_option()].
set_options
的有效選項為
check_schedulers
- 如果啟用,將會向每個排程器發送訊號以檢查其回應能力。 系統檢查會在傳送任何心跳訊號到埠程式之前發生。 如果任何排程器反應不夠快,heart 程式將不會收到其心跳訊號,因此最終會終止節點。
如果選項有效,則傳回值 ok
。