我在不同的 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 上生成循环?