[erlang]supervisor(監控樹)的重啓策略

1. init函數

init() ->
    {ok, {SupFlags, [ChildSpec,...]}} | ignore.

[ChildSpec,...] 是在init以後默認要啓動的子進程。app

2. SupFlags參數

{Type, Times, Sec}函數

  • Type: 重啓策略
    • one_for_one: 一個子進程終止,只重啓該進程,在init的時候會啓動參數內的子進程
    • simple_one_for_one: 同one_for_one,可是在init的時候不會啓動子進程,須要動態調用啓動
    • one_for_all: 一個子進程終止,將重啓全部子進程
    • rest_for_one: 一個子進程終止,將按順序重啓這個子進程和以後順序的子進程
  • Times: 次數(監控頻率)
  • Sec: 秒數(監控頻率),若是在Sec秒內重啓次數超過Times,則終止全部進程,並終止監控樹,將由父進程決定它的命運

3. ChildSpec參數以下

{Id, StartFunc, Restart, Shutdown, Type, Modules}

%% 或者

#{
    id => child_id(),
    start => mfaargs(),
    restart => restart(),
    shutdown => shutdown(),
    type => work(),
    modules => modules()
}
  • Id 子進程ID標識符
  • StartFunc = {M, F, A}: 子程序啓動入口
  • Restart: 重啓方案
    • permanent: 若是app終止了,整個系統都會中止工做(application:stop/1除外)。
    • transient: 若是app以normal的緣由終止,沒有影響。任何其它終止緣由都誰致使整個系統關閉。
    • temporary: app能夠以任何緣由終止。只產生報告,沒有其它任何影響。
  • Shutdown: 終止策略
    • brutal_kill: 無條件終止
    • 超時值(毫秒): 終止時,若是超時,則強制終止
    • infinity: 若是子進程是監控樹,設置爲無限大,等待其終止爲止
  • Type:
    • worker: 普通子進程
    • supervisor: 子進程是監控樹
  • Modules:
    • dynamic: 當子進程是gen_event
    • [Module]: 當子進程是監控樹、gen_server或者gen_fsm,表示回調模塊名稱

4. 監控樹操做

Sup一般能夠爲?MODULErest

% 啓動監控樹
supervisor:start_link(Sup, []).

% 啓動一個子進程
supervisor:start_child(Sup, ChildSpec).

% 中止一個子進程
supervisor:terminate(Sup, Id).

% 刪除一個子進程
supervisor:delete_child(Sup, Id).
相關文章
相關標籤/搜索