monitor_nodes(Flag) -> ok | Error
monitor_nodes(Flag, Options) -> ok | Error
Flag = boolean()
Options = OptionsList | OptionsMap
OptionsList = [ListOption]
ListOption =
connection_id | {node_type, NodeType} | nodedown_reason
OptionsMap =
#{connection_id => boolean(),
node_type => NodeType,
nodedown_reason => boolean()}
NodeType = visible | hidden | all
Error = error | {error, term()}
调用进程订阅或取消订阅节点状态更改消息。当新节点连接时,nodeup
消息将传递到所有订阅进程,而当节点断开连接时,将传递 nodedown
消息。
如果 Flag
是 true
,则开始新的订阅。如果 Flag
是 false
,则以相同 Options
开始的所有先前订阅都将停止。如果两个选项列表包含相同的选项集,则它们被视为相同。
nodeup
/nodedown
消息的传送保证:
-
nodeup
消息在通过新建立的连接传递来自远程节点的任何信号之前传递。 -
nodedown
消息在通过连接来自远程节点的所有信号都已传递后传递。 -
nodeup
消息在erlang:nodes()
的结果中出现相应节点后传递。 -
nodedown
消息在erlang:nodes()
结果中相应节点消失后传递。 -
从 OTP 23.0 开始,由于到同一节点的新连接,将在
nodeup
消息之前传送正在断开的连接的nodedown
消息。在 OTP 23.0 之前,不能保证一定会出现这种情况。
节点状态更改消息的格式取决于 Options
。如果Options
为空列表或调用net_kernel:monitor_nodes/1
,则格式如下:
{nodeup, Node} | {nodedown, Node}
Node = node()
什么时候Options
是空映射或空列表,调用者只会订阅可见节点的状态更改消息。也就是说,只有出现在结果中的节点erlang:nodes/0
.
如果Options
等于空列表以外的任何值,则状态更改消息的格式如下:
{nodeup, Node, Info} | {nodedown, Node, Info}
Node = node()
Info = #{Tag => Val} | [{Tag, Val}]
Info
是映射或二元组列表。其内容取决于Options
。如果Options
是一张Map,那么Info
也将是一张Map。如果Options
是一个列表,那么Info
也将是一个列表。
当Options
是映射时,当前允许以下关联:
connection_id => boolean()
-
如果关联的值等于
true
, Aconnection_id => ConnectionId
协会将被纳入Info
Map哪里ConnectionId
是建立或断开连接的连接标识符。有关此连接标识符的更多信息,请参阅文档erlang:节点/2. node_type => NodeType
-
NodeType
的有效值:visible
-
仅订阅可见节点的节点状态更改消息。关联
node_type => visible
将包含在Info
映射中。 hidden
-
仅订阅隐藏节点的节点状态更改消息。关联
node_type => hidden
将包含在Info
映射中。 all
-
订阅可见节点和隐藏节点的节点状态更改消息。关联
node_type => visible | hidden
将包含在Info
映射中。
如果不
node_type => NodeType
协会被纳入Options
map,调用者只会订阅可见节点的状态变化消息,但是不node_type => visible
协会将被纳入Info
Map。 nodedown_reason => boolean()
-
如果关联的值等于
true
,则nodedown_reason => Reason
关联将包含在nodedown
消息的Info
映射中。Reason
可以是任何术语,具体取决于所使用的分发模块或进程,但对于标准 TCP 分发模块,它是以下其中一项:connection_setup_failed
-
连接设置失败(发送
nodeup
消息后)。 no_network
-
没有可用的网络。
net_kernel_terminated
-
net_kernel
进程终止。 shutdown
-
未指定的连接关闭。
connection_closed
-
连接已关闭。
disconnect
-
连接已断开(强制从当前节点断开)。
net_tick_timeout
-
净刻度time-out。
send_net_tick_failed
-
无法通过连接发送网络时钟信号。
get_status_failed
-
从保持连接的
Port
检索状态信息失败。
当Options
是列表时,当前ListOption
可以是以下之一:
connection_id
-
A
{connection_id, ConnectionId}
元组将被包含在Info
其中ConnectionId
是建立或断开连接的连接标识符。有关此连接标识符的更多信息,请参阅文档erlang:节点/2. {node_type, NodeType}
-
NodeType
的有效值:visible
-
仅订阅可见节点的节点状态更改消息。元组
{node_type, visible}
将包含在Info
列表中。 hidden
-
仅订阅隐藏节点的节点状态更改消息。元组
{node_type, hidden}
将包含在Info
列表中。 all
-
订阅可见节点和隐藏节点的节点状态更改消息。元组
{node_type, visible | hidden}
将包含在Info
列表中。
如果不
{node_type, NodeType}
已给出选项。调用者只会订阅可见节点的状态变化消息,但是不{node_type, visible}
元组将被包含在Info
列表。 nodedown_reason
-
元组
{nodedown_reason, Reason}
将包含在nodedown
消息的Info
列表中。请参阅文档
nodedown_reason => boolean()
上述关联有关可能的信息Reason
值。
例子:
(a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
ok
(a@localhost)2> flush().
Shell got {nodeup,b@localhost,
#{connection_id => 3067552,node_type => visible}}
Shell got {nodeup,c@localhost,
#{connection_id => 13892107,node_type => hidden}}
Shell got {nodedown,b@localhost,
#{connection_id => 3067552,node_type => visible,
nodedown_reason => connection_closed}}
Shell got {nodedown,c@localhost,
#{connection_id => 13892107,node_type => hidden,
nodedown_reason => net_tick_timeout}}
Shell got {nodeup,b@localhost,
#{connection_id => 3067553,node_type => visible}}
ok
(a@localhost)3>
相关用法
- erlang monitor_scope()用法及代码示例
- erlang monitor(Type :: process, Item :: monitor_process_identifier())用法及代码示例
- erlang monitor(Type :: process, Item :: monitor_process_identifier(), Opts :: [monitor_option()])用法及代码示例
- erlang monitor(Socket)用法及代码示例
- erlang module(AbsForms)用法及代码示例
- erlang max用法及代码示例
- erlang member用法及代码示例
- erlang min用法及代码示例
- erlang merge用法及代码示例
- erlang make_dir用法及代码示例
- erlang memory用法及代码示例
- erlang match(Table, Pattern)用法及代码示例
- erlang match_spec_run(List, CompiledMatchSpec)用法及代码示例
- erlang make_tuple(Arity, InitialValue)用法及代码示例
- erlang make_tuple(Arity, DefaultValue, InitList)用法及代码示例
- erlang map_get(Key, Map)用法及代码示例
- erlang map_size(Map)用法及代码示例
- erlang max(Term1, Term2)用法及代码示例
- erlang memory()用法及代码示例
- erlang min(Term1, Term2)用法及代码示例
- erlang map(Fun, Orddict1)用法及代码示例
- erlang merge(Fun, Orddict1, Orddict2)用法及代码示例
- erlang map(Fun, MapOrIter)用法及代码示例
- erlang merge(Map1, Map2)用法及代码示例
- erlang merge_with(Combiner, Map1, Map2)用法及代码示例
注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 monitor_nodes(Flag) -> ok | Error。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。