私はスーパーバイザーを書きました(以下に表示)。
を使用して取得した子プロセスは 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]}]}}.