4

マスター ノードを短い名前で起動し、プロセスを実行してノードのアップとダウンのメッセージを監視します。

> erl -sname master -cookie monster
Erlang R15B03 (erts-5.9.3) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] [dtrace]

Eshell V5.9.3  (abort with ^G)
(master@pencil)1> c("/tmp/monitor.erl").
{ok,monitor}
(master@pencil)2> Pid = monitor:start().
<0.44.0>
(master@pencil)3> Pid ! running.
RECV :: running
running
(master@pencil)4> net_adm:names().
{ok,[{"master",52564}]}

この時点では、masterノードのみが実行されています。同じマシンで 2 番目のノードを起動します。

> erl -sname client -cookie monster
Erlang R15B03 (erts-5.9.3) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false] [dtrace]

Eshell V5.9.3  (abort with ^G)
(client@pencil)1>

ドキュメントを間違って読んでいて、正味のティックレートに問題がある場合に備えて、少し待ってください。何もないので、マスターで接続を強制します。

(master@pencil)5> net_adm:names().
{ok,[{"master",52564},{"client",52579}]}
(master@pencil)6>

私の小さな監視プロセスからは何もありません。ここで、同じことを行って長い名前を使用すると (つまり、-name問題なく動作します)。net_kernelしかし、ドキュメントにはそれについて言及されていないので、私は驚いています。どうしたんだ?


上記のmonitor.erl参照は次のとおりです。

-module(monitor).

-export([start/0]).

start() ->
    spawn_link(fun init_loop/0).

%%%===================================================================
%%% Internal Functions
%%%===================================================================

init_loop() ->
    net_kernel:monitor_nodes(true, []),
    loop().

loop() ->
    receive
    Msg -> io:format(user, "RECV :: ~p~n", [Msg])
    end,
    loop().
4

1 に答える 1

3

net_kernel:monitor_nodes/2 短い名前と長い名前のいずれかを持つノードの nodeup/nodedown メッセージを確実に配信します。

ただし、nodeupドキュメントに記載されているように、メッセージはノードが接続されている場合にのみ配信されます。ノードがまったく接続されていないため、nodeupメッセージを受け取った理由-nameは謎です (ここでは再現できませんでした) 。net_adm:names/0ローカルに登録されたノードのリストを取得するために、epmd にのみ接続します。異なる Cookie を持つノードも一覧表示されます。

net_adm:ping/1(またはrpc呼び出し)を使用してクライアントをマスター (またはその逆) に接続すると、監視プロセスがnodeupメッセージを受信します。

于 2013-11-13T16:33:40.187 に答える