如何处理Erlang中另一个节点的死亡?

时间:2014-05-07 12:49:20

标签: erlang

我有两个相互连接的节点,其中一个是服务器。服务器想知道客户端是否死亡。我做了这样的事情:

link(Client).

在服务器进程中,当我这样做时,我收到一个异常错误:noconnection然后服务器终止,当客户端死亡时。我只想知道客户端是否死机,我不希望服务器死掉,我该如何处理死亡消息?

2 个答案:

答案 0 :(得分:2)

如果您有两个erlang节点,并且想要采取某些操作以防一个节点出现故障(或网络连接丢失),您可能希望使用erlang:monitor_node/2,3函数:

(n1@myhost)1> erlang:monitor_node('n2@myhost', true).
true

然后,如果'n2@myhost'节点关闭,您的进程将收到消息:

(n1@myhost)2> flush().
Shell got {nodedown,n2@myhost}

(注意,我是从erlang shell那样做的,这就是为什么我可以调用flush/0来查看shell进程邮箱中的内容)

如果您对某个流程感兴趣,可以在第二个节点上使用erlang:monitor/2

(n1@myhost)3> Ref = erlang:monitor(process, {'n2@myhost', some_registered_name}).
#Ref<0.0.0.117>

从现在起,如果some_registered_name发生故障,您将收到一条消息,您可以采取行动。

您也可能对如何撰写distributed applications

感兴趣

答案 1 :(得分:1)

要进行单向监督,您应该使用monitors。然后,如果客户端死亡,您的服务器将收到一条消息。