> Erlang中文手册 > monitor/2 开启一个监控过程

erlang:monitor/2

开启一个监控过程

用法:

monitor(Type, Item) -> MonitorRef

对被调用的进程开启一个监控过程,参数 Type 是被监控对象 Item 的类型。

当前只有进程可以被监视,Type 的取值只允许是 process,但其他类型也许以后会被允许。

Item 可以是:

  • pid():一个进程标识符是 pid 的进程被监控
  • {RegName, Node}:用元组包含着一个进程的注册名和一个节点名。驻留在节点 Node 的注册名为 RegName 的进程将被监控
  • RegName:本地节点上注册名为 RegName 的进程将被注册

如果被监控的对象 Item 死亡,或者是不存在,或者是对象 Item 所在的节点失去了连接,那么一个 'DOWN' 的信息将会发送到被监控的进程上。一个 'DOWN' 消息的格式如下:

{'DOWN', MonitorRef, Type, Object, Info}

MonitorRef 是该监控过程的一个引用,Type 是指上面所说的对象类型,

Object 是监控对象的一个引用。如果 Item 指定为 pid,那么 Object 是被监控进程的 pid。如果 Item 指定为 {RegName, Node},那么 Object 则是 {RegName, Node}。如果 Item 指定为 RegName,那么 Object 则是 {RegName, Node}(这里的 Node 是指本地节点 node())。

当接收到一条 'DOWN' 消息,或调用了 erlang:demonitor/1 函数,监控过程将被停止。

可以对同一个对象 Item 开启多个监控过程,他们只负责各自的监控事务,并不会报错。

erlang:monitor(process, self()).
spawn(fun()->
    erlang:monitor(process,Proc),
    receive
        {'DOWN', Ref, process, Pid,  normal} -> 
            io:format("~p said that ~p died by natural causes~n",[Ref,Pid]);
        {'DOWN', Ref, process, Pid,  Reason} ->
            io:format("~p said that ~p died by unnatural causes~n~p",[Ref,Pid,Reason])
    end        
end).