当工作人员这样做时,主管会崩溃,而主管则不应该

时间:2014-03-04 18:34:03

标签: erlang otp supervisor

我有一个Erlang supervisor监督基于gen_server的工作服务器的进程,我启动form the shell我的主管,这反过来启动我的工作服务器没有问题,它看起来像这样:

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

但是当我崩溃我的工作服务器时,我的主管因为未知原因而崩溃了。

我在互联网上找到了解决方法,我用这个:

start_link_shell() ->
    {ok,Pid} = supervisor:start_link({local, ?SERVER}, ?MODULE, []),
    unlink(Pid).

现在它工作正常,但我不明白为什么,任何人都可以解释一下吗?


**

更新

**

这是我的初始函数

%%%===================================================================

init([]) ->

    % Building Supervisor specifications

    RestartStrategy = one_for_one,
    MaxRestarts = 2,
    MaxSecondsBetweenRestarts = 5000,

    SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts},


    % Building Child specifications

    Restart = permanent,
    Shutdown = 2000,    % Number of seconds the child is allowed to run after receiving shutdown message
    Type = worker,

    ChildSpec = {'db_server', 
                {'db_server', start_link, []},
                Restart, 
                Shutdown, 
                Type, 
                ['db_server']},


    % Putting Supervisor and Child(ren) specifications in the return

    {ok, {SupFlags, [ChildSpec]}}.

1 个答案:

答案 0 :(得分:0)

根据link

来自shell的测试主管的问题是主管进程链接到shell进程。当gen_server进程崩溃时,退出信号会传播到shell崩溃并重新启动..这只会用于测试,否则,OTP应用程序应该启动主管并链接到它。