0

我写了一个主管(如下所示)。

它只有一个我从使用中获得的子进程locations:start_link/0。我希望它能够启动一个主管并在全球范围内注册自己。这样,我可以使用global:whereis_name/1.

当我通过外壳启动主管时,它按预期工作:

 $ 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 时才会注册主管进程?

主管模块:

-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]}]}}.
4

1 回答 1

0

您可能有这样的一个原因是因为您不是以分布式模式启动节点。

首先添加这样的参数来看看启动过程中会发生什么:erl -boot start_sasl. 第二个添加节点名称(它会自动启用分布式模式):... -sname my_node

所以启动命令将如下所示:

erl -boot start_sasl -sname my_node -s locator_sup start_link
于 2013-10-24T01:46:21.927 回答