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

Erlang 在启动脚本中注册全局进程,erlang,erlang-shell,Erlang,Erlang Shell,我写了一封主管信(如下所示) 它只有一个子进程,我通过使用位置:start\u link/0获得。我希望它能成立一个监管机构,并在全球范围内注册。这样,我就可以使用global:whereis_name/1访问 当我通过shell启动supervisor时,它会按预期工作: $ erl 1> locator_suo:start_link(). registering global supervisor starting it.... supervisor <0.34.0&g

我写了一封主管信(如下所示)

它只有一个子进程,我通过使用
位置:start\u link/0
获得。我希望它能成立一个监管机构,并在全球范围内注册。这样,我就可以使用
global:whereis_name/1
访问

当我通过shell启动supervisor时,它会按预期工作:

 $ erl
 1> locator_suo:start_link().
 registering global supervisor
 starting it....
 supervisor <0.34.0>
 {ok,<0.34.0>}
所以我的问题是,为什么只有当我从shell使用start_链接时,主管进程才会被注册

主管模块:

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

您可能有这样一个原因,那就是您启动的节点不是在分布式模式下

首先,添加这样的参数以查看启动期间发生的情况:
erl-boot start\u sasl
。 第二个添加节点名(它将自动启用分布式模式):
-sname my_节点

因此,启动命令将如下所示:

erl -boot start_sasl -sname my_node -s locator_sup start_link

使用启动脚本时,如何连接到shell(运行
global:whereis_name/1
)?启动脚本将您留在shell中。这不是一个脚本,只是命令
erl-s locator\u sup start\u link
看起来你的主管在启动后马上就死了。try
进程是否处于活动状态(列表到pid(“”)
。此帖子可能会有所帮助:。所以本质上你的问题是重复的。
1> global:whereis_name( locator_sup ).
undefined
-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]}]}}.
erl -boot start_sasl -sname my_node -s locator_sup start_link