我写了一个主管(如下所示)。
它只有一个我从使用中获得的子进程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]}]}}.