无法从 shell 生成 erlang 主管
Posted
技术标签:
【中文标题】无法从 shell 生成 erlang 主管【英文标题】:Cannot spawn an erlang supervisor from the shell 【发布时间】:2011-02-16 15:50:37 【问题描述】:我已经实现了一个 gen_server 和主管: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
执行相同的操作,则不会在我的“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_server
和echo_sup
,两个非常简单的模块。
鉴于该代码,这是可行的:
spawn(echo_server, start_link, []).
但事实并非如此:
spawn(echo_sup, start_link, []).
【问题讨论】:
你能把你的代码粘贴到某个地方吗? 【参考方案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 被禁用)和 主管关闭。这说得通 在主管的情况下,因为 主管是由其父母产生的 在监督树中 - 如果没有 每当其父关闭时死亡, 不管是什么原因,你都会有 悬挂着树的“树枝”。
【讨论】:
以上是关于无法从 shell 生成 erlang 主管的主要内容,如果未能解决你的问题,请参考以下文章
如何在不中止 erl 的情况下中止 Erlang shell (erl) 中的接收语句?
为啥常见的 Erlang 应用程序(Common Test、Dialyzer、leex、yecc 等)在 `erl` shell 中不可用?
erl 程序输出的值与 erlang shell 输出的值不同
从 bash 变量为 Erlang erl 传递 -eval 失败