【问题标题】:Erlang supervisor silently failing to startErlang主管默默无法启动
【发布时间】:2021-03-18 03:22:42
【问题描述】:

我是 Erlang 初学者,正在学习 OTP。 我在运行时尝试与主管交谈时收到noproc 错误。事实上,那个主管的start_link(由我实现,而不是主管:start_link())似乎没有被执行,因为它第一行的io:fwrite甚至没有被输出。

原来问题是主管的一个孩子缺少一些gen_server 回调函数(应用程序没有使用这些函数)。编译器记录了一个警告,就是这样,当我启动应用程序时没有错误。我不确定发生了什么,但不应该有一些错误指示发生吗?

如果它很重要,这就是主管本身的子规范的样子:

ElementSup = {sc_element_sup,
                    {sc_element_sup, start_link, []},
                    permanent, 2000, supervisor, [sc_element]},

【问题讨论】:

标签: erlang erlang-supervisor


【解决方案1】:

首先,我得到一个编译器错误:

2> c(my_worker).
my_worker.erl:5: function terminate/2 undefined
error

然后,主管让我知道它没有启动,因为它无法启动所有子代:

3> my_sup:start_link().                  
** exception exit: {shutdown,
                    {failed_to_start_child,my_worker, 
                     {'EXIT',
                      {undef,
                       [{my_worker,start_link,[],[]},
                        {supervisor,do_start_child,2,
                         [{file,"supervisor.erl"},{line,365}]},
                        {supervisor,start_children,3,
                         [{file,"supervisor.erl"},{line,348}]},
                        {supervisor,init_children,2, 
                         [{file,"supervisor.erl"},{line,314}]},
                        {gen_server,init_it,2,
                         [{file,"gen_server.erl"},{line,365}]},
                        {gen_server,init_it,6,
                         [{file,"gen_server.erl"},{line,333}]},
                        {proc_lib,init_p_do_apply,3,
                         [{file,"proc_lib.erl"},{line,247}]}]}}}}

事实上,那个主管的 start_link 似乎没有被执行,因为 第一行的 io:fwrite 甚至没有被删除。

主管的start_link() 函数是在OTP 库中定义的,因此您不能在该函数中包含io:fwrite()。您可以将io:fwrite() 行添加到您定义的函数中,然后调用supervisor:start_link(),例如:

start_my_supervisor() ->
    io:format("hello~n"),
    Args = [],
    supervisor:start_link({local, ?MODULE}, ?MODULE, Args).

“hello”消息在我的 erlang shell 输出中显示得很好。

【讨论】:

  • 我的错,我的意思不是supervisor:start_link,而是我的主管中的start_link(),当子模块中缺少回调函数时似乎没有执行。 io:fwrite() 仅在我纠正错误后才记录,因此给人的印象是它甚至没有运行,甚至没有启动主管,因为也没有任何错误。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 2017-02-04
  • 2016-06-21
  • 1970-01-01
  • 2012-10-01
  • 2012-04-03
  • 2011-02-16
  • 2012-06-22
相关资源
最近更新 更多