无法从shell生成erlang管理程序

我已经实现了gen_server和supervisor: 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执行相同的test_sup ,则不会在我的“CLI进程”(使用registered/0 )中注册新的名称/ Pid。 我的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而不是主管?


更新

我正在使用的代码可以在这篇文章中找到。 我使用echo_serverecho_sup ,这两个非常简单的模块。

鉴于该代码,这个工作:

spawn(echo_server, start_link, []).

这并不是:

spawn(echo_sup, start_link, []).

无论何时试图弄清楚这些事情,通常都很有帮助打开SASL。

应用程序:启动(SASL)。

这样你就会希望知道你的主管为什么要终止。


Bernard Duggan在Erlang的邮件列表中给出了这个解释:

当链接的进程以代码“正常”退出时,链接进程不会自动死亡。 这就是为什么当产卵过程退出时[echo_server]不会退出。 那么为什么主管死亡? 管理程序模块的内部实际上是作为gen_server实现的,但是设置了process_flag(trap_exit,true)。 这样做的结果是,当父进程死亡时,terminate()被调用(当trap_exit被禁用时不会发生)并且监控程序关闭。 在监督员的情况下,由于监督人员是由监督人员在监督树中产生的 - 如果监督人员在其父母关闭时没有死亡,无论出于什么原因,您都会在树的“分支”中摇晃。

链接地址: http://www.djcxy.com/p/38261.html

上一篇: Cannot spawn an erlang supervisor from the shell

下一篇: Erlang how to set up a supervisor tree application that is self contained