1

単純なスーパーバイザー構成があります。

-module(my_supervisor).
-behaviour(supervisor).
-export([start_link/0, init/1]).

init(_Args) ->
    {ok, { {one_for_one, 5, 10},
       [
        {my_worker, {my_worker, start_link, []}, permanent, 5000, worker, [my_worker]}
        ]
     }
}.

そして単純な労働者でさえ:

-module(my_worker).
-export([start_link/0]).
start_link() ->
    %??? is this the first time the supervisor is starting me or have I crashed and been restarted???

では、start_link関数がスーパーバイザーによって初めて呼び出されたのか、ワーカープロセスが過去にクラッシュして現在再起動されているのかを判断することも可能ですか?

4

1 に答える 1

0
  1. start_link関数がスーパーバイザーによって呼び出されたのはこれが初めてかどうかを判断するため。childId次のようにパラメータを使用childIdして外部から渡すことができます。詳細については、 erlang Supervisorに関するドキュメントを参照してください。

    start_child(ChildId, Mod, Args) -> {ok, _} = スーパーバイザー:start_child(?SERVER, {ChildId, {Mod, start_link, Args}, transient, ?MAX_WAIT, worker, [Mod]}), ok.

  2. 判定workerを再開しました。モニターとリンクのドキュメントをお読みください。クラッシュが発生すると、プロセスはメッセージを受け取ります。supervisorのソース コードを読むと、スーパーバイザーが実際に監視タスクlink and monitorを解決するために使用していることがわかります。crash

3.

init([]) -> 
     process_flag(trap_exit, true), 
     ...


terminate(_Reason, _State) ->
    % may be crash here by check reason above. 
    ok.

handle_info({'EXIT',Self,Reason},State#state{self=Self)->
    error_logger:info_report([crash_now]),
    {stop,Reason,State};



  [1]: http://www.erlang.org/doc/man/supervisor.html
于 2013-01-03T12:02:58.983 に答える