Erlang supervisor无法以静默方式启动

tf7tbtn2  于 2022-11-19  发布在  Erlang
关注(0)|答案(1)|浏览(140)

我是一个Erlang初学者,正在学习OTP。当我试图在运行时与一个管理员对话时,我收到了一个noproc错误。事实上,那个管理员的start_link(由我实现,而不是由supervisor:start_link()实现)似乎没有被执行,因为它第一行中的io:fwrite甚至没有被输出。
结果发现问题是Supervisor的一个子进程缺少一些gen_server回调函数(应用程序没有使用这些函数)。编译器记录了一个警告,就这样,当我启动应用程序时没有错误。我不确定发生了什么,但是应该有一些错误指示发生吗?
如果它很重要,Supervisor本身的子规范看起来就是这样的:

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

ldxq2e6h1#

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

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甚至没有输出。
Supervisor的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输出中显示得很好。

相关问题