如何确定监督树中的工作人员是第一次启动还是已重新启动

时间:2013-01-03 10:47:10

标签: erlang otp supervisor

我有一个简单的主管配置:

-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函数,或者工作进程在过去的某个时间崩溃并且现在正在重新启动?

1 个答案:

答案 0 :(得分:0)

  1. 用于确定这是否是第一次由主管调用start_link功能。 您可以使用childId参数并从外部传递childId,如下所示,有关详细信息,请提供有关erlang supervisor的文档。

    start_child(ChildId,Mod,Args) - >     {ok,_} = supervisor:start_child(?SERVER,                                      {ChildId,{Mod,start_link,Args},                                       瞬态,?MAX_WAIT,worker,[Mod]}),     确定。

  2. 确定worker已重新启动。请阅读monitor and link的文件。发生崩溃时,您的进程将收到消息。如果您阅读supervisor的源代码,您会发现主管实际使用link and monitor来解决crash监控任务。

  3. 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