查看源代码 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 ...

如果需要常规的核心转储,请通过使用环境变量 HEART_KILL_SIGNAL=SIGABRT 将终止信号设置为中止来通知 heart。如果未设置或未设置为 SIGABRT,则默认行为是使用 SIGKILL 的终止信号。

% erl -heart -env HEART_KILL_SIGNAL SIGABRT ...

如果 heart 应该终止 Erlang 运行时系统,可以使用环境变量 HEART_NO_KILL=TRUE 来指示。如果 heart 执行的命令负责处理此问题,例如作为特定清理序列的一部分,则此方法很有用。如果未设置或未设置为 TRUE,则默认行为将是按照上述说明进行终止。

% erl -heart -env HEART_NO_KILL 1 ...

此外,ERL_CRASH_DUMP_SECONDSheart 上具有以下行为

  • ERL_CRASH_DUMP_SECONDS=0 - 完全禁止写入崩溃转储文件,从而立即重新启动运行时系统。这与不设置环境变量相同。

  • ERL_CRASH_DUMP_SECONDS=-1 - 将环境变量设置为负值不会重新启动运行时系统,直到完全写入崩溃转储文件为止。

  • ERL_CRASH_DUMP_SECONDS=S - heart 等待 S 秒以让写入崩溃转储文件。在 S 秒后,无论是否写入崩溃转储文件,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 值。