1

我有一个 Erlangsupervisor来监督基于 的工作服务器的进程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]}}.
4

1 回答 1

1

根据此链接

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

于 2014-03-04T20:56:13.450 回答