erlang进程监控:link和monitor

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

进程双向监控-Link

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

例子1:

[plain] view plaincopy

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

运行代码:

[plain] view plaincopy

  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. 3> test:start().
  10. Pid <0.67.0>
  11. Pid2 <0.68.0>
  12. ok
  13. %% 杀掉Pid2进程,进程Pid收到通知
  14. 4> exit(pid(0,68,0),kill).
  15. pid2 exit: {‘EXIT‘,<0.68.0>,killed}
  16. true

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

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

进程单向监控-Monitor

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

例子2:

[plain] view plaincopy

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

运行代码:

[plain] view plaincopy

  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. 3> test:start().
  10. Pid <0.43.0>
  11. Pid3 <0.44.0>
  12. ok
  13. %% 杀掉Pid3进程,进程Pid没有收到通知
  14. 4> exit(pid(0,44,0),kill).
  15. true

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

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

[plain] view plaincopy

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

转自: http://blog.csdn.net/mycwq/article/details/13171117

时间: 2024-08-10 00:04:58

erlang进程监控:link和monitor的相关文章

分析erlang进程监控的实现

Erlang支持Monitor和Link两种监控进程的方式,使得所有进程可以连成一个整体.当某个进程出错退出时,监控进程会收到该进程退出的消息通知.有了这些特点,使用Erlang建立一个简单,并且健壮的系统就不是什么难事.前面有文章分析了两种方式的用法,这里分析下monitor和link的实现. 源码分析 monitor 和link实现有点类似,下面以monitor为例做说明(erlang版本R16B02) erlang:monitor/2的实现 // bif.c 实现 erlang:monit

【转载】Erlang 中 link 和 monitor 的区别

Link and Monitor differences 原文地址 Introduction link/1 and monitor/2 are 2 different ways of notifying (or know) that a process died. Thing is, these are really very different in nature and these differences are not widely understood by beginners. So

Linx监控分享--重点进程监控(mysqld)+邮件提醒

重点进程监控 mysqld:进程退出了,报警.没有退出则监控mysqld的(cpu(>=100%)|| mem(>=80%))开始提醒,同时收集和分析mysql状态信息:连接数(>=max_connections * 0.8)开始提醒:打开的句柄数(>=8192*0.8?)开始提醒. 待完善... 如果是单机多实例的话,只需要增加一个for循环就好了. 在手机上安装网易的邮件客户端,就可以达到实时提醒的效果. 关于mail的配置,见之前的文章:http://blog.csdn.ne

用Python的Supervisor进行进程监控以及自动启动

做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下. 结合之前在腾讯工作的经验,也会讲讲腾讯的服务器监控是怎么做的.同时也会讲下小团队又该怎么敏捷的解决. 下面按照监控的方法依次介绍. 一.按照进程名监控 在腾讯内部所有server都是要打包发布的,而在打包过程中是需要填写要监控的进程名,然后在crontab中定时通过ps查询进程是否存在. 这种方法是比较简单的方法,但是考虑到很多进程会在启

AIX进程监控脚本分享一例

分享一个AIX进程监控脚本: 当MWM进程数大于2时,调用sendmail发送邮件通知用户,脚本如下 #!/usr/bin/ksh #---------------------------------------------------------------# # Script Name : MWM Check Shell # Created by  : Xin23 #         on  : 2015.02.04 #------------------------------------

使用monit规范的扩展业务的进程监控和管理

前言: 看到这个标题的人一定会很疑惑,进程监控和报警,不都是用zabbix,nagios么?  对于管理的话,自己写crontab脚本不就行了. 当然这肯定是可以的. 标题说了,规范和扩展!   所谓的进程监控就是 在进程不可用,或者是被kill掉,也有外因,比如进程吃内存大,需要重启进程,让他初始化程序的实例,简单说,就是进程pid是在,只是进程是假死的,不可用的. 对于这些进程管理和监控的需求,说下圈子里面解决这类问题的办法: 大家一定知道supervisord这个东西,现在很多人都喜欢用他

Linux/Unix shell 监控Oracle监听器(monitor listener)

使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linux 下使用 shell 脚本来监控 Oracle 监听器. Linux Shell的相关参考:        Linux/Unix shell 脚本中调用SQL,RMAN脚本        Linux/Unix shell sql 之间传递变量        Linux/Unix shell 调用

Erlang进程堆垃圾回收机制

引言 在之前的文章中,我们介绍了如何使用Scala IDE也就是eclipse中集成的Scala开发插件来进行Scala语言程序的开发,在使用了一段时间之后,发现eclipse对Scala的支持并不是很好.用户体验比较差,比如联想速度比较慢等.由于在公司一直使用的Scala开发工具是Intellij IDEA(好吧,其实我使用Scala IDE的目的就是想试一下这两个各有什么优缺点),各方面感觉还不错,所以在此介绍一下这个开发环境. Intellij IDEA是jetbrain开发的一个IDE,

Erlang进程间消息接收超时设定

Erlang消息接收函数,一般都会设计成尾递归调用自己的模式.但是这样的模式,如果没有消息则会无限的等待下去,所以为了不无限等待,这里可以加个超时设定,例如: flush() -> receive _ -> flush() after 1000 -> ok end. 有个特殊情况是,当超时时间设定为0时,程序不是立马退出,而是先将message box中的消息匹配完后,再返回. 更多进程消息信息请戳这里 Erlang进程间消息接收超时设定,布布扣,bubuko.com