2016-12-16 4 views
0

테스트 모듈과 one_for_one 관리자가 있습니다.자식 실행 후 얼랑 관리자가 종료 됨

test.erl

-module(test). 

-export([do_job/1,run/2, start_worker/1]). 


run(Id, Fun) -> 
    test_sup:start_child(Id, [Fun]). 


do_job(Fun) -> 
    Fun(). 


start_worker(Args) -> 
    Pid = spawn_link(test, do_job, Args), 
    io:format("started ~p~n",[Pid]), 
    {ok, Pid}. 

test_sup.erl

-module(test_sup). 
-behaviour(supervisor). 

-export([start_link/0]). 
-export([init/1]). 
-export([start_child/2]). 

start_link() -> 
    supervisor:start_link({local, ?MODULE}, ?MODULE, []). 


init(_Args) -> 
    SupFlags = #{strategy => one_for_one, intensity => 2, period => 20}, 
    {ok, {SupFlags, []}}. 


start_child(Id, Args) -> 
    ChildSpecs = #{id => Id, 
        start => {test, start_worker, [Args]}, 
        restart => transient, 
        shutdown => brutal_kill, 
        type => worker, 
        modules => [test]}, 

    supervisor:start_child(?MODULE, ChildSpecs). 

지금 내가 쉘에서 관리자를 시작하고 세 번 좋은 작품과 기능 start_worker/1 재시작 명령 test:run(id, fun() -> erlang:throw(err) end).을 실행하지만 그 후, 예외 수퍼바이저 프로세스가 종료되고 명령 test_sup:start_link()을 사용하여 수동으로 시작해야합니다. 문제가 무엇입니까?

쉘 :

1> test_sup:start_link(). 
{ok,<0.36.0>} 
2> test:run(id, fun() -> erlang:throw(err) end). 
started <0.38.0> 
started <0.39.0> 
started <0.40.0> 
{ok,<0.38.0>} 

=ERROR REPORT==== 16-Dec-2016::23:31:50 === 
Error in process <0.38.0> with exit value: 
{{nocatch,err},[{test,do_job,1,[]}]} 

=ERROR REPORT==== 16-Dec-2016::23:31:50 === 
Error in process <0.39.0> with exit value: 
{{nocatch,err},[{test,do_job,1,[]}]} 

=ERROR REPORT==== 16-Dec-2016::23:31:50 === 
Error in process <0.40.0> with exit value: 
{{nocatch,err},[{test,do_job,1,[]}]} 
** exception exit: shutdown 

답변

2

문제가 무엇입니까?

"문제"가 없습니다. you told it to 정확히 일하고 :

이 최대 다시 시작 강도가 위의지도에서 키의 강도와 기간으로 지정된 두 개의 정수 값을 사용하여 정의되는 자식 프로세스 종단 및 재시작의 무한 루프에 들어가기에서 수퍼바이저를 방지하기 위해. 강도에 대한 MaxR 값과 기간에 대한 MaxT 값을 가정하면, MaxR 재시작이 MaxT 초 이내에 발생하면 감독자는 모든 하위 프로세스를 종료 한 다음 자체를 종료합니다.

감독자의 구성은 "나는 20 초 (period)에서 아이에게 2 배 이상 (intensity)를 다시 시작해야하는 경우, 다음 일이 그래서 그냥 종료 잘못이다"라고 말한다. 수퍼바이저를 수동으로 다시 시작해야하는 이유는 감독관이 자체 감독을받지 않기 때문입니다. 그렇지 않으면 감독자의 감독자가 자체 구성에 따라 다시 시작하려고 할 수 있습니다.