天天看点

【原创】Erlang 之 heart 功能

      我们写的程序不可能都没有 bug ,都存在 crash 的危险。很多时候我们需要个看门狗(watchdog)程序,在发现系统不正常的时候,就把系统重新启动。这类 watchdog 程序从内核到各种高可用程序都会设置有一个。erlang 系统当然不能免俗,也有个 heart 。 

我们来看下流程和效果: 

      我们看到 erl 重新被启动起来了。现在简单的分析下原理。

heart 由两部份组成: 

外部程序: heart

erlang port 模块: heart.erl

      当开启 heart 的时候(erl –heart xxx) 外部程序 heart 被 erlang 模块 heart.erl 作为独立的(子)进程启动起来,监视 emulator 的运作。heart.erl 每隔一定的时间向 heart 外部程序报告状态。当外部 heart 没有监测到心跳的时候就要采取行动,重新运行 $heart_command 所指定的命令。 

heart 机制有两个用处: 

erlang 虽然内置了很多 supervisor,可以保证 process 的高可靠性,但是假如 emulator 死亡了,那这一切都消失了,erlang 只能靠 heart 来重新启动。

热部署的时候 release_handling 需要重新启动 emulator 的时候也必须借助外部程序,即 heart 来辅助。

所以在 heart 模式下,你的 erlang 程序是杀不掉的,除非你先 kill 掉 heart 进程,这个 pid 就是启动的时候输出的 heart_beat_kill_pid (从下面我的实验中可以看出,霸爷的这个结论是错误的!)。 

祝玩得开心! 

-=-=-=-=- 我是88界奥斯卡颁奖礼的分隔线 -=-=-=-=- 

基于上述内容, 实验验证如下

【验证博文中的操作】 

另一个窗口 

【验证手动杀死各类进程的效果】 

后台启动 erlang 进程 

可以看到,此时创建了两个进程:erlang 业务进程 + heart 子进程 

杀死 erlang 业务进程后,能看到其 heart 子进程会重新创建 erlang 业务进程和新 heart 子进程。 

再一次杀死 erlang 业务进程,可以看到 erlang 进程的父 heart 进程也消失了,而 erlang 进程的 heart 子进程会重新启动 erlang 业务进程和其 heart 子进程。 

杀死 erlang 业务进程的父 heart 进程,可以看到对 erlang 业务进程和其子 heart 进程无任何影响。 

再一次杀死 erlang 业务进程,能看到其 heart 子进程会重新创建 erlang 业务进程和新 heart 子进程。 

杀死 erlang 业务进程的 heart 子进程,可以看到 erlang 业务进程也随之消失了。 

【验证通过不同信号杀死进程的效果】 

以下内容均在窗口 1 中观察 

以下内容均在窗口 2 中观察 

补充: