erlang进程监控:link和monitor
Erlang最开始是为了电信产品而发展起来的语言,因为这样的目的,决定了她对错误处理的严格要求。Erlang除了提供exception,try catch等语法,还支持Link和Monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。当某个进程出错退出时,其他进程都会收到该进程退出的消息通知。有了这些特点,使用erlang建立一个简单,并且健壮的系统就不是什么难事。
进程双向监控-Link
link方式可以建立进程之间的双向链接关系,当其中一个进程退出时,另一个进程会收到该进程退出的消息。
例子1:
- -module(test).
- -export([start/0]).
- start() ->
- Pid = spawn(fun() ->loop() end),
- Pid2 = spawn(fun() ->loop_link(Pid) end),
- io:format("Pid ~p~nPid2 ~p~n", [Pid,Pid2]).
- loop_link(Pid) ->
- process_flag(trap_exit, true),
- erlang:link(Pid),
- receive
- Msg ->
- io:format("pid exit: ~p~n", [Msg])
- end.
- loop() ->
- process_flag(trap_exit, true),
- receive
- Msg ->
- io:format("pid2 exit: ~p~n", [Msg])
- end.
运行代码:
- 1> test:start().
- Pid <0.63.0>
- Pid2 <0.64.0>
- ok
- %% 杀掉Pid进程,进程Pid2收到通知
- 2> exit(pid(0,63,0),kill).
- pid exit: {'EXIT',<0.63.0>,killed}
- true
- 3> test:start().
- Pid <0.67.0>
- Pid2 <0.68.0>
- ok
- %% 杀掉Pid2进程,进程Pid收到通知
- 4> exit(pid(0,68,0),kill).
- pid2 exit: {'EXIT',<0.68.0>,killed}
- true
注:erlang进程默认不捕捉Exit信号,可以使用process_flag(trap_exit, true)改变这一默认行为。
注2:解除link监控用erlang:unlink(Pid)
进程单向监控-Monitor
Monitor方式则实现进程的单向监控,当被监控进程退出时,监控进程会收到该进程退出的消息。
例子2:
- -module(test).
- -export([start/0]).
- start() ->
- Pid = spawn(fun() ->loop() end),
- Pid3 = spawn(fun() ->loop_monitor(Pid) end),
- io:format("Pid ~p~nPid3 ~p~n", [Pid,Pid3]).
- loop_monitor(Pid) ->
- _MonitorRef = erlang:monitor(process, Pid),
- receive
- Msg ->
- io:format("pid exit: ~p~n", [Msg])
- end.
- loop() ->
- receive
- Msg ->
- io:format("pid3 exit: ~p~n", [Msg])
- end.
运行代码:
- 1> test:start().
- Pid <0.39.0>
- Pid3 <0.40.0>
- ok
- %% 杀掉Pid进程,进程Pid3收到通知
- 2> exit(pid(0,39,0),kill).
- pid exit: {'DOWN',#Ref<0.0.0.80>,process,<0.39.0>,killed}
- true
- 3> test:start().
- Pid <0.43.0>
- Pid3 <0.44.0>
- ok
- %% 杀掉Pid3进程,进程Pid没有收到通知
- 4> exit(pid(0,44,0),kill).
- true
注:解除monitor监控用erlang:demonitor(MonitorRef)
如果进程是以 normal 方式退出,erlang将不会发出进程退出通知
- 10> exit(pid(0,70,0), normal).
- true
转自: http://blog.csdn.net/mycwq/article/details/13171117
erlang进程监控:link和monitor的更多相关文章
- Erlang进程的Link机制
这篇文章还不是最终版,有时间时,我会再来补充完善. 什么是link Erlang程序基于进程建模,进程之间的交互机制有收发消息,link和monitor.其中,收发消息通常用于正常的进程间通讯,而li ...
- erlang link 与 monitor
erlang设计中,通常会有这样一个需求: 某一个进程必须依赖于令一个进程的概念,在这样的情况下就必须对两个进程之间建立一个监控或者说连接关系,以监听对方的死亡情况. erlang 提供了两个这样的方 ...
- 【转载】Erlang 中 link 和 monitor 的区别
Link and Monitor differences 原文地址 Introduction link/1 and monitor/2 are 2 different ways of notifyin ...
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html ...
- linux 进程监控和自动重启的简单实现(转)
目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...
- Zabbix4.0添加端口和进程监控
一:Zabbix设置主动模式: vim /etc/zabbix/zabbix_agent.conf Server=192.168.1.10 #被动模式的serverip地址,如果设置纯被动模式,可以注 ...
- zookeeper编程入门系列之zookeeper实现分布式进程监控和分布式共享锁(图文详解)
本博文的主要内容有 一.zookeeper编程入门系列之利用zookeeper的临时节点的特性来监控程序是否还在运行 二.zookeeper编程入门系列之zookeeper实现分布式进程监控 三. ...
- windows 进程监控 Procmon.exe
windows 进程监控 Procmon.exe window下一个程序打开太慢,可以用此程序监控.在哪一步慢了,读取文件还是注册表. ProcessMonitor3.2 Process Monito ...
- Zookeeper概念学习系列之zookeeper实现分布式进程监控
不多说,直接上干货! 假设要监控多台服务器上的A程序运行状态, 当发现有服务器上的A程序下线的时候, 给管理员发短信, 并且尝试重启A程序. zookeeper实现分布式进程监控主要利用zk的临时节点 ...
随机推荐
- C++中STL常用容器的区别(转)
我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...
- golang xorm MSSQL where查询案例
xorm官方中文文档 参考 http://xorm.io/docs/ 以sqlserver为例 先初始化连接等... engine, err := xorm.NewEngine("mssql ...
- LeetCode OJ-- Add Binary
https://oj.leetcode.com/problems/add-binary/ 对两个二进制字符串求和. 对于字符串 ans_str,求它的翻转. reverse(ans_str.begin ...
- webservice原理及基于cxf开发的基本流程
一.SOA和webservice SOA(service-Oriented Architecture)是面向服务的架构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的 ...
- 10.1综合强化刷题 Day3
括号序列(bracket) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的 ...
- codevs_1043 方格取数(棋盘DP)
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description ...
- gradients的一些注意点
Each variable has a [.grad_fn] attribute that references a Function that has created the Variable(ex ...
- jersey上传文件解决办法
这两天在使用jersey 构建的jersey JAX-RS REST服务器,在通过POST方法上传文件的时候,如果根据example来操作的话会引发如下异常: SEVERE: Missing depe ...
- Visual Studio开启SSL的支持
前提: 请确保已经安装了IIS Express 具体操作: 1.web项目->[右键]->[使用IIS Express]转换工程的Web服务器. 2.点击web项目,按[ctrl]+[w] ...
- Inno Setup打包的安装程序在Vista/Win7上自动提示需要管理员权限的方法
来源:http://hi.baidu.com/jingrensoft/blog/item/c34575cfae4fb926f9dc617f.html 首先,在 [Setup]段 PrivilegesR ...