【问题标题】:Cannot spawn an erlang supervisor from the shell无法从 shell 生成 erlang 主管
【发布时间】:2011-02-16 15:50:37
【问题描述】:

我已经实现了一个 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 进程”中注册新名称/Pid(使用 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, []).

【问题讨论】:

  • 你能把你的代码粘贴到某个地方吗?

标签: erlang erlang-otp erlang-supervisor


【解决方案1】:

每当试图弄清楚这些事情时,打开 SASL 通常会很有帮助。

应用程序:启动(sasl)。

这样你就有希望知道你的主管为什么要离职。

【讨论】:

  • 它似乎没有终止。启动 SASL 后,我收到一个进度报告,显示 echo_sup 和 echo_server 已启动,但此后无法从命令行访问 echo_server。
  • 我必须查看您的主管代码和您的 gen_server 才能为您提供更多帮助。您可能只是缺少一些小东西。
  • 我链接到更新 #1 中的代码。 Here's the link again
【解决方案2】:

此解释由 Bernard Duggan 在Erlang questions mailing list 上给出:

链接的进程不会自动 当他们链接到一个进程时死亡 退出代码“正常”。这就是为什么 [echo_server] 不退出时 产卵过程退出。那为什么 主管死了?的内部结构 主管模块实际上是 自己实现为 gen_server,但有 process_flag(trap_exit, true) 设置。 其结果是,当 父进程死亡,terminate() 得到 调用(当 trap_exit 被禁用)和 主管关闭。这说得通 在主管的情况下,因为 主管是由其父母产生的 在监督树中 - 如果没有 每当其父关闭时死亡, 不管是什么原因,你都会有 悬挂着树的“树枝”。

【讨论】:

    猜你喜欢
    • 2013-03-21
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2012-01-10
    • 1970-01-01
    • 2011-08-07
    • 2012-11-16
    相关资源
    最近更新 更多