0

私はスーパーバイザーを書きました(以下に表示)。

を使用して取得した子プロセスは 1 つだけ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 関数が呼び出されているようですがグローバル名でスーパーバイザーを検索しようとすると undefined になります

1> global:whereis_name( locator_sup ).
undefined

私の質問は、シェルから 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

その理由の 1 つは、ノードを分散モードで起動していないためです。

まず、そのようなパラメータを追加して、起動時に何が起こるかを確認します: erl -boot start_sasl. 2 番目にノード名を追加します (自動的に分散モードが有効になります):... -sname my_node

したがって、起動コマンドは次のようになります。

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