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