erlang进程监控:link和monitor

转载 2018年04月16日 15:29:02

Erlang最开始是为了电信产品而发展起来的语言,因为这样的目的,决定了她对错误处理的严格要求。Erlang除了提供exception,try catch等语法,还支持Link和Monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。当某个进程出错退出时,其他进程都会收到该进程退出的消息通知。有了这些特点,使用erlang建立一个简单,并且健壮的系统就不是什么难事。

进程双向监控-Link

link方式可以建立进程之间的双向链接关系,当其中一个进程退出时,另一个进程会收到该进程退出的消息。

例子1:

  1. -module(test).  
  2. -export([start/0]).  
  3.   
  4. start() ->  
  5.     Pid = spawn(fun() ->loop() end),  
  6.     Pid2 = spawn(fun() ->loop_link(Pid) end),  
  7.     io:format("Pid ~p~nPid2 ~p~n", [Pid,Pid2]).  
  8.   
  9. loop_link(Pid) ->  
  10.     process_flag(trap_exit, true),  
  11.     erlang:link(Pid),  
  12.     receive  
  13.         Msg ->  
  14.             io:format("pid exit: ~p~n", [Msg])  
  15.     end.  
  16.   
  17. loop() ->  
  18.     process_flag(trap_exit, true),  
  19.     receive  
  20.         Msg ->  
  21.             io:format("pid2 exit: ~p~n", [Msg])  
  22.     end.  

运行代码:

  1. 1> test:start().  
  2. Pid <0.63.0>  
  3. Pid2 <0.64.0>  
  4. ok  
  5. %% 杀掉Pid进程,进程Pid2收到通知  
  6. 2> exit(pid(0,63,0),kill).  
  7. pid exit: {'EXIT',<0.63.0>,killed}  
  8. true  
  9.   
  10. 3> test:start().  
  11. Pid <0.67.0>  
  12. Pid2 <0.68.0>  
  13. ok  
  14. %% 杀掉Pid2进程,进程Pid收到通知  
  15. 4> exit(pid(0,68,0),kill).  
  16. pid2 exit: {'EXIT',<0.68.0>,killed}  
  17. true  

注:erlang进程默认不捕捉Exit信号,可以使用process_flag(trap_exit, true)改变这一默认行为。

注2:解除link监控用erlang:unlink(Pid)

进程单向监控-Monitor

Monitor方式则实现进程的单向监控,当被监控进程退出时,监控进程会收到该进程退出的消息。

例子2:

  1. -module(test).  
  2.   
  3. -export([start/0]).  
  4.   
  5. start() ->  
  6.     Pid = spawn(fun() ->loop() end),  
  7.     Pid3 = spawn(fun() ->loop_monitor(Pid) end),  
  8.     io:format("Pid ~p~nPid3 ~p~n", [Pid,Pid3]).  
  9.       
  10. loop_monitor(Pid) ->  
  11.     _MonitorRef = erlang:monitor(process, Pid),  
  12.     receive  
  13.         Msg ->  
  14.             io:format("pid exit: ~p~n", [Msg])  
  15.     end.  
  16.   
  17. loop() ->  
  18.     receive  
  19.         Msg ->  
  20.             io:format("pid3 exit: ~p~n", [Msg])  
  21.     end.      

运行代码:

  1. 1> test:start().  
  2. Pid <0.39.0>  
  3. Pid3 <0.40.0>  
  4. ok  
  5. %% 杀掉Pid进程,进程Pid3收到通知  
  6. 2> exit(pid(0,39,0),kill).  
  7. pid exit: {'DOWN',#Ref<0.0.0.80>,process,<0.39.0>,killed}  
  8. true  
  9.   
  10. 3> test:start().  
  11. Pid <0.43.0>  
  12. Pid3 <0.44.0>  
  13. ok  
  14. %% 杀掉Pid3进程,进程Pid没有收到通知  
  15. 4> exit(pid(0,44,0),kill).  
  16. true  

注:解除monitor监控用erlang:demonitor(MonitorRef)

如果进程是以 normal 方式退出,erlang将不会发出进程退出通知

 

  1. 10> exit(pid(0,70,0), normal).  
  2. true  

[Erlang]link进程信号详解

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface联系邮箱:cto@188.com估计很多同学都会对link时各种信号及捕捉机制有点迷糊...
  • abv123456789
  • abv123456789
  • 2015-06-27 23:54:43
  • 2148

通用的进程监控脚本process_monitor.sh使用方法

通过需要将process_monitor.sh放到crontab上,以便系统重启自动生效,也可避免process_monitor.sh被意外终止导致失效,crontab的时间部分一般设置为1分钟执行一...
  • Aquester
  • Aquester
  • 2017-05-24 09:23:31
  • 1027

Process Monitor监控目录 - 监控文件被哪个进程操作了。

转载请注明: 用Process Monitor监控目录 | 薤叶芸香's blog http://plumgo.cc/trace-folder-using-process-monitor/ ...
  • zhang_sinner
  • zhang_sinner
  • 2014-02-11 10:56:56
  • 7519

erlang性能分析及进程监控工具

erlang性能分析工具使用示例
  • huang1196
  • huang1196
  • 2014-08-18 16:49:51
  • 5204

erlang分布式之节点自动连接相关问题

最近做一个游戏跨服功能。其实对erlang来说,天生支持
  • pyf725324
  • pyf725324
  • 2014-11-04 23:48:53
  • 701

erlang监控进程在启动进程退出后异常退出原因分析

一、问题引出         erlang监控进程在启动时设置了trap_exit为true,即会捕获到退出信号,会将退出信号转换为{‘EXIT’,Pid,Reason}存入自己的邮箱中,因此与监控...
  • zcc_0015
  • zcc_0015
  • 2014-09-23 22:17:18
  • 1491

erlang的监控树之重启

最近在开发过程中遇到一个问题,大概是这样的,原先一个worker进程,现在要改成可以随时去掉,也可以随时在重启,这个进程的supervisor是one_for_one类型的,如果不改变supervis...
  • pyf725324
  • pyf725324
  • 2014-04-22 15:39:26
  • 676

windows系统performance monitor监控进程性能

  • 2016年11月16日 17:32
  • 498KB
  • 下载

erlang进程trap_exit捕获异常退出

Erlang除了提供try catch,catch等语法,还支持link和monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。除了这样,erlang还提供trap_exit方法让...
  • cwqcwk1
  • cwqcwk1
  • 2014-11-16 15:56:53
  • 4274
收藏助手
不良信息举报
您举报文章:erlang进程监控:link和monitor
举报原因:
原因补充:

(最多只允许输入30个字)