进程单向监控-Monitor
2013-04-28 10:53
218 查看
进程单向监控-Monitor
link方式可以建立进程之间的双向链接关系,我们可以通过monitor实现单向的监控,这在gen_server代码里面可以看到对应的例子
erlang:monitor(process, Caller), %建立单向监控
被监控进程死掉发送的消息规格: {'DOWN',Mref,process,Pid,Reason}
解除监控:erlang:demonitor(Ref)
gen_server代码片段:
do_multi_call(Nodes, Name, Req, Timeout) ->
Tag = make_ref(),
Caller = self(),
Receiver =
spawn(
fun() ->
%% Middleman process. Should be unsensitive to regular
%% exit signals. The sychronization is needed in case
%% the receiver would exit before the caller started
%% the monitor.
process_flag(trap_exit, true),
Mref = erlang:monitor(process, Caller), %建立单向监控
receive
{Caller,Tag} ->
Monitors = send_nodes(Nodes, Name, Tag, Req),
TimerId = erlang:start_timer(Timeout, self(), ok),
Result = rec_nodes(Tag, Monitors, Name, TimerId),
exit({self(),Tag,Result});
{'DOWN',Mref,_,_,_} -> %接受监控消息
%% Caller died before sending us the go-ahead.
%% Give up silently.
exit(normal)
end
end),
Mref = erlang:monitor(process, Receiver),
Receiver ! {self(),Tag},
receive
{'DOWN',Mref,_,_,{Receiver,Tag,Result}} ->
Result;
{'DOWN',Mref,_,_,Reason} ->
%% The middleman code failed. Or someone did
%% exit(_, kill) on the middleman process => Reason==killed
exit(Reason)
end.
handle_call({subscribe, PId}, _From, #state{subscribers = Subscribers} = State) ->
NSubscribers = ordsets:add_element(PId, Subscribers),
erlang:monitor(process, PId),
{reply, {ok, ok}, State#state{subscribers = NSubscribers}};
handle_info({'DOWN', _MRef, _, PId, _Reason}, #state{subscribers = Subscribers} = State) ->
NSubscribers = ordsets:del_element(PId, Subscribers),
{noreply, State#state{subscribers = NSubscribers}};
link方式可以建立进程之间的双向链接关系,我们可以通过monitor实现单向的监控,这在gen_server代码里面可以看到对应的例子
erlang:monitor(process, Caller), %建立单向监控
被监控进程死掉发送的消息规格: {'DOWN',Mref,process,Pid,Reason}
解除监控:erlang:demonitor(Ref)
gen_server代码片段:
do_multi_call(Nodes, Name, Req, Timeout) ->
Tag = make_ref(),
Caller = self(),
Receiver =
spawn(
fun() ->
%% Middleman process. Should be unsensitive to regular
%% exit signals. The sychronization is needed in case
%% the receiver would exit before the caller started
%% the monitor.
process_flag(trap_exit, true),
Mref = erlang:monitor(process, Caller), %建立单向监控
receive
{Caller,Tag} ->
Monitors = send_nodes(Nodes, Name, Tag, Req),
TimerId = erlang:start_timer(Timeout, self(), ok),
Result = rec_nodes(Tag, Monitors, Name, TimerId),
exit({self(),Tag,Result});
{'DOWN',Mref,_,_,_} -> %接受监控消息
%% Caller died before sending us the go-ahead.
%% Give up silently.
exit(normal)
end
end),
Mref = erlang:monitor(process, Receiver),
Receiver ! {self(),Tag},
receive
{'DOWN',Mref,_,_,{Receiver,Tag,Result}} ->
Result;
{'DOWN',Mref,_,_,Reason} ->
%% The middleman code failed. Or someone did
%% exit(_, kill) on the middleman process => Reason==killed
exit(Reason)
end.
handle_call({subscribe, PId}, _From, #state{subscribers = Subscribers} = State) ->
NSubscribers = ordsets:add_element(PId, Subscribers),
erlang:monitor(process, PId),
{reply, {ok, ok}, State#state{subscribers = NSubscribers}};
handle_info({'DOWN', _MRef, _, PId, _Reason}, #state{subscribers = Subscribers} = State) ->
NSubscribers = ordsets:del_element(PId, Subscribers),
{noreply, State#state{subscribers = NSubscribers}};
相关文章推荐
- 进程单向监控-Monitor
- erlang进程监控:link和monitor
- erlang进程监控:link和monitor
- 通用的进程监控脚本process_monitor.sh使用方法
- erlang进程监控:link和monitor
- 监控Storm进程 NimbusMonitor.sh
- Python进程监控-MyProcMonitor
- 使用process_monitor.sh监控hadoop进程的crontab配置
- Druid Monitor监控JavaSE,杀cmd端口进程
- erlang进程监控:link和monitor
- linux进程监控,monitor脚本
- erlang进程监控:link和monitor
- 使用process_monitor.sh监控hadoop进程的crontab配置
- android monitor tool (8.0 监控文件系统 添加哪个进程修改文件功能)
- shell 脚本对 Linux 系统和进程资源进行监控
- linux ubuntu 下利用shell脚本监控单个进程的内存占用率以及cpu使用率
- apache kafka监控系列-KafkaOffsetMonitor
- 监控固定Tuxedo服务进程
- linux监控某个进程的运行shell脚本
- spring-boot-admin源码分析及单机监控spring-boot-monitor的实现(二)