Erlang supervisor不重新启动子进程
我想了解一下erlang主管。我有一个简单的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
打印机流程
,每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:
以下是您使用文件创建的体系结构:
test_sup (supervisor)
^
|
v
test (worker)
然后通过在shell中调用start\u link()
启动您的主管。这将创建另一个双向链接:
shell
^
|
v
test_sup (supervisor)
^
|
v
test (worker)
对于双向链路,如果任何一方死亡,则另一方死亡
当您运行时,您正在shell中导致错误
您的shell链接到您的主管,因此Erlang会杀死主管作为回应。通过连锁反应,你的工人也会被杀
我认为您打算将错误条件发送给您的工作人员,而不是shell: