在启动脚本中注册全局进程

时间:2013-10-18 21:30:29

标签: erlang erlang-shell

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

我只使用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]}]}}.

1 个答案:

答案 0 :(得分:0)

您可能遇到这种情况的一个原因是因为您未以分布式模式启动节点。

首先添加此类参数以查看启动期间发生的情况:erl -boot start_sasl。 第二个添加节点名称(它将自动启用分布式模式):... -sname my_node

所以启动命令看起来像:

erl -boot start_sasl -sname my_node -s locator_sup start_link