查看源代码 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 ...
如果需要常规的核心转储,请通过使用环境变量 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_SECONDS
在 heart
上具有以下行为
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
是
类型
函数
-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
值。