天天看點

【原創】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 中觀察 

補充: