2010-05-07 19 views
4

我已经实现了gen_server和supervisor:test_servertest_sup。我想从shell/CLI测试它们。我写了他们的start_link函数,以便他们的名字在本地注册。无法从shell中产生erlang管理程序

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

例如,我可以通过执行酿出test_server

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

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

但是,如果我尝试使用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而不是监督者?


更新

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

鉴于代码,这个工程:

spawn(echo_server, start_link, []). 

,这并不:

spawn(echo_sup, start_link, []). 
+1

你能把你的代码粘贴到什么地方吗? – 2010-05-07 05:53:21

回答

1

这说明是由伯纳德·杜根在Erlang questions mailing list

链接的过程不会自动 模时的过程,他们都与 退出与代码“正常”。这就是为什么当 产卵过程退出时, [echo_server]不会退出。那么,为什么主管死亡?内部的 监督模块实际上是 本身实现为 gen_server,但 process_flag(trap_exit,true)集合。 这样做的结果是,当 父进程死亡时,terminate()获取 调用(当 trap_exit被禁用时不会发生),并且 监管程序关闭。这是有道理的 处于监管的情况下,因为 监事由它在监督树父 产生了 - 如果没有 模具只要其母公司关机, 无论是什么原因,你不得不 晃来晃去“树的分支“。

3

每当试图找出这些东西通常是非常有益的关于SASL切换。

application:start(sasl)。

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

+0

它似乎没有终止。在启动SASL后,我得到一个进度报告,说明echo_sup和echo_server已启动,但之后无法通过命令行访问echo_server。 – drfloob 2010-05-07 18:21:20

+0

我不得不看你的主管代码和你的gen_server来帮助你。可能只是你缺少的东西。 – Lukas 2010-05-07 22:13:43

+0

我链接到更新#1中的代码。 [再次链接](http://stackoverflow.com/questions/2775114/erlang-otp-supervisor-crashing) – drfloob 2010-05-08 19:50:54