生成的 monitor_node 没有捕获 nodedown 消息

问题描述 投票:0回答:0

我在不同的 PC 上有一个主节点和一个备份节点。我希望 BNode 监视 MNode,这样如果 M 失败,B 可以重新启动 M 上的一些应用程序。
我的想法是让 M 在 B 上生成一个循环,为自己初始化一个监视器,所以如果它掉落,循环将捕获消息并处理它:

MNode 运行:

spawn(BNode, ...., node_loop, [node()]).

B节点代码:

node_loop(MNode) ->
    monitor_node(MNode, true),
    node_loop().

node_loop() ->
    receive
        {nodedown, Node} -> restart_modules;
        Mes -> skip
    end,
    node_loop().

问题是所有输出只显示在 MNode 上,即使代码在 BNode 上运行也是如此。更糟糕的是,当我杀死/停止 MNode 时,该进程从 BNode 中完全消失,使其无用,因为它无法捕获 nodedown 消息。
例如,当从 M 向 B 上的 node_loop 发送消息时:

(MNode)1> LoopPID ! hi.
skip
=======================
(BNode)1> %%% nothing here

为什么我不能这样监控MNode?如何在完全脱离 MNode 的 BNode 上生成循环?

erlang distributed
© www.soinside.com 2019 - 2024. All rights reserved.