无法从shell生成erlang管理程序
我已经实现了gen_server和supervisor: test_server
和test_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_server
和echo_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