我有一个简单的主管配置:
-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函数,或者工作进程在过去的某个时间崩溃并且现在正在重新启动?
答案 0 :(得分:0)
用于确定这是否是第一次由主管调用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]}), 确定。
确定worker
已重新启动。请阅读monitor and link的文件。发生崩溃时,您的进程将收到消息。如果您阅读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