无法从shell生成erlang管理程序

时间:2010-05-07 01:49:20

标签: erlang otp supervisor

我已经实现了gen_server和主管:test_servertest_sup。我想从shell / CLI测试它们。我写了他们的start_link函数,以便他们的名字在本地注册。

我发现我可以从命令行中生成test_server,但生成的test_sup根本不允许我与服务器进行交互。

例如,我可以通过执行:

生成test_server
1> spawn(test_server, start_link, []).
<0.39.0>
2> registered().
[...,test_server,...]

我可以与服务器进行交互,一切正常。

但是,如果我尝试对test_sup执行相同操作,则在我的“CLI过程”中不会注册新名称/ Pids(使用registered/0)。我的test_server似乎已经产生了,但我无法与之互动(参见Lukas Larsson关于SASL的评论,看看为什么会这样)。

我假设我在我的主管中编码错误,但这种启动我的主管的方法完全正常:

1> {ok, Pid}= test_sup:start_link([]).
{ok, <0.39.0>}
2> unlink(Pid).
true
3> registered().
[...,test_server,test_sup,...]

为什么我可以产生gen_server但不能产生主管?


更新

我正在使用的代码可以在this post中找到。我正在使用echo_serverecho_sup两个非常简单的模块。

鉴于该代码,这有效:

spawn(echo_server, start_link, []).

而这不是:

spawn(echo_sup, start_link, []).

2 个答案:

答案 0 :(得分:3)

每当试图解决这些问题时,打开SASL通常都非常有帮助。

应用:启动(SASL)

这样你就可以了解主管为什么要终止。

答案 1 :(得分:1)

Bernard Duggan在Erlang questions mailing list

上给出了这个解释
  

链接的进程不会自动进行   当他们被链接的过程死亡   退出代码“正常”。这就是为什么   [echo_server]不会退出时   产卵过程退出。那么为什么呢   主管死了吗?内部的   事实上,主管模块   自己实现为   gen_server,但有   process_flag(trap_exit,true)设置。   这样做的结果就是当   父进程死掉,terminate()得到   叫(当发生时不会发生)   trap_exit已禁用)和   主管关闭。这说得通   在主管的背景下,从那以后   主管由其父母产生   在监督树 - 如果没有   父母关闭时死亡,   无论什么原因,你都有   悬挂在树上的“树枝”。