我写了一位主管(如下所示)。
我只使用locations:start_link/0
获得了一个子进程。我希望它能够启动一个主管并在全球注册。这样,我可以使用global:whereis_name/1
。
当我通过shell启动主管时,它按预期工作:
$ erl
1> locator_suo:start_link().
registering global supervisor
starting it....
supervisor <0.34.0>
{ok,<0.34.0>}
然后我可以通过它的全局名称locator_sup来实现它:
2> global:whereis_name( locator_sup ).
<0.34.0>
但我想使用启动脚本启动系统,所以我尝试启动系统:
$ erl -s locator_sup start_link
registering global supervisor
starting it....
supervisor <0.32.0>
似乎调用了主管的init函数,但是当我尝试通过其全局名称找到主管时,我得到了未定义的
1> global:whereis_name( locator_sup ).
undefined
所以我的问题是,为什么只有在我从shell使用start_link时才会注册supervisor进程?
主管模块:
-module(locator_sup).
-behaviour(supervisor).
%% API
-export([start_link/0]).
%% Supervisor callbacks
-export([init/1]).
%% ===================================================================
%% API functions
%% ===================================================================
start_link() ->
io:format( "registering global supervisor\n" ),
{ok, E} = supervisor:start_link({global, ?MODULE}, ?MODULE, []),
io:format("supervisor ~p\n", [E] ),
{ok, E}.
%% ===================================================================
%% Supervisor callbacks
%% ===================================================================
% only going to start the gen_server that keeps track of locations
init(_) ->
io:format( "starting it....\n" ),
{ok, {{one_for_one, 1, 60},
[{locations, {locations, start_link, []},
permanent, brutal_kill, worker, [locations]}]}}.
答案 0 :(得分:0)
您可能遇到这种情况的一个原因是因为您未以分布式模式启动节点。
首先添加此类参数以查看启动期间发生的情况:erl -boot start_sasl
。
第二个添加节点名称(它将自动启用分布式模式):... -sname my_node
所以启动命令看起来像:
erl -boot start_sasl -sname my_node -s locator_sup start_link