我有一个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]}}.
答案 0 :(得分:0)
根据link:
来自shell的测试主管的问题是主管进程链接到shell进程。当gen_server进程崩溃时,退出信号会传播到shell崩溃并重新启动..这只会用于测试,否则,OTP应用程序应该启动主管并链接到它。