Erlang supervisor不重新启动子进程

Erlang supervisor不重新启动子进程,erlang,erlang-supervisor,fault-tolerance,Erlang,Erlang Supervisor,Fault Tolerance,我想了解一下erlang主管。我有一个简单的打印机流程,每3秒钟打印一次hello。我还有一个主管,如果出现任何异常,必须重新启动打印机进程 这是我的密码: test.erl: -module(test). -export([start_link/0]). start_link() -> io:format("started~n"), Pid = spawn_link(fun() -> loop() end), {ok, Pid}. loo

我想了解一下erlang主管。我有一个简单的
打印机流程
,每3秒钟打印一次hello。我还有一个主管,如果出现任何异常,必须重新启动
打印机进程

这是我的密码:

test.erl:

-module(test).
-export([start_link/0]).    

start_link() ->
    io:format("started~n"),
    Pid = spawn_link(fun() -> loop() end),
    {ok, Pid}.    

loop() ->
    timer:sleep(3000),
    io:format("hello~n"),
    loop().
测试辅助设备:

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

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

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

init(_Args) ->
    SupFlags = #{strategy => one_for_one, intensity => 1, period => 5},    
    ChildSpecs = [#{id => test,
                    start => {test, start_link, []},
                    restart => permanent,
                    shutdown => brutal_kill,
                    type => worker,
                    modules => [test]}],    
    {ok, {SupFlags, ChildSpecs}}.
现在,我运行这个程序并使用
test\u sup:start\u link()。
命令启动监控程序,几秒钟后,我引发一个异常。为什么主管不重新启动
打印机进程

以下是shell输出:

1> test_sup:start_link().
started
{ok,<0.36.0>}
hello
hello
hello
hello          
2> erlang:error(err).

=ERROR REPORT==== 13-Dec-2016::00:57:10 ===
** Generic server test_sup terminating 
** Last message in was {'EXIT',<0.34.0>,
                           {err,
                               [{erl_eval,do_apply,6,
                                    [{file,"erl_eval.erl"},{line,674}]},
                                {shell,exprs,7,
                                    [{file,"shell.erl"},{line,686}]},
                                {shell,eval_exprs,7,
                                    [{file,"shell.erl"},{line,641}]},
                                {shell,eval_loop,3,
                                    [{file,"shell.erl"},{line,626}]}]}}
** When Server state == {state,
                            {local,test_sup},
                            one_for_one,
                            [{child,<0.37.0>,test,
                                 {test,start_link,[]},
                                 permanent,brutal_kill,worker,
                                 [test]}],
                            undefined,1,5,[],0,test_sup,[]}
** Reason for termination == 
** {err,[{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]},
         {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
         {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]},
         {shell,eval_loop,3,[{file,"shell.erl"},{line,626}]}]}
** exception error: err
1>测试:启动链接()。
起动
{好的,}
你好
你好
你好
你好
2> erlang:错误(err)。
=错误报告===2016年12月13日::00:57:10===
**通用服务器测试\u sup终止
**中的最后一条消息是{'EXIT',,
{呃,
[erl_eval,do_apply,6,
[{file,“erl_eval.erl”},{line,674}]},
{shell,exprs,7,
[{file,“shell.erl”},{line,686}]},
{shell,eval_exprs,7,
[{file,“shell.erl”},{line,641}]},
{shell,eval_loop,3,
[{file,“shell.erl”},{line,626}]}}
**当服务器状态=={state,
{local,test_sup},
一对一,
[{child,,test,
{test,start_link,[]},
永久的,残暴的杀戮,工人,
[测试]}],
未定义,1,5,[],0,测试支持,[]
**终止原因==
**{err,[{erl_eval,do_apply,6,[{file,“erl_eval.erl”},{line,674}]},
{shell,exprs,7,[{file,“shell.erl”},{line,686}]},
{shell,eval_exprs,7,[{file,“shell.erl”},{line,641}]},
{shell,eval_循环,3,[{file,“shell.erl”},{line,626}]}
**异常错误:err

当您执行erlang:error(err)时。
您正在终止调用进程,即您的shell

当您使用start_link启动监控程序时,它也会被终止,循环也会被终止

shell会自动重新启动(多亏了一些主管),但是没有人重新启动您的测试主管,这无法重新启动循环

要进行此测试,您应执行以下操作:

模块内测试:

start_link() ->
    Pid = spawn_link(fun() -> loop() end),
    io:format("started ~p~n",[Pid]),
    {ok, Pid}.
您将得到提示:

started <0,xx,0>

仅终止循环。

当执行erlang:error(err)时。终止调用进程,即shell

当您使用start_link启动监控程序时,它也会被终止,循环也会被终止

shell会自动重新启动(多亏了一些主管),但是没有人重新启动您的测试主管,这无法重新启动循环

要进行此测试,您应执行以下操作:

模块内测试:

start_link() ->
    Pid = spawn_link(fun() -> loop() end),
    io:format("started ~p~n",[Pid]),
    {ok, Pid}.
您将得到提示:

started <0,xx,0>

仅终止循环。

以下是您使用文件创建的体系结构:

test_sup (supervisor)
  ^
  |
  v
 test (worker)
然后通过在shell中调用
start\u link()
启动您的主管。这将创建另一个双向链接:

shell
  ^
  |
  v
test_sup (supervisor)
  ^
  |
  v
 test (worker)
对于双向链路,如果任何一方死亡,则另一方死亡

当您运行时,您正在shell中导致错误

您的shell链接到您的主管,因此Erlang会杀死主管作为回应。通过连锁反应,你的工人也会被杀

我认为您打算将错误条件发送给您的工作人员,而不是shell:

  • 确定工作人员的Pid:
  • 调用工人的Pid

  • 以下是您使用文件创建的体系结构:

    test_sup (supervisor)
      ^
      |
      v
     test (worker)
    
    然后通过在shell中调用
    start\u link()
    启动您的主管。这将创建另一个双向链接:

    shell
      ^
      |
      v
    test_sup (supervisor)
      ^
      |
      v
     test (worker)
    
    对于双向链路,如果任何一方死亡,则另一方死亡

    当您运行时,您正在shell中导致错误

    您的shell链接到您的主管,因此Erlang会杀死主管作为回应。通过连锁反应,你的工人也会被杀

    我认为您打算将错误条件发送给您的工作人员,而不是shell:

  • 确定工作人员的Pid:
  • 调用工人的Pid
  • 可能的重复可能的重复