- 浏览: 981988 次
- 性别:
- 来自: 广州
最新评论
-
qingchuwudi:
有用,非常感谢!
erlang进程的优先级 -
zfjdiamond:
你好 这条命令 在那里输入??
你们有yum 我有LuaRocks -
simsunny22:
这个是在linux下运行的吧,在window下怎么运行escr ...
escript的高级特性 -
mozhenghua:
http://www.erlang.org/doc/apps/ ...
mnesia 分布协调的几个细节 -
fxltsbl:
A new record of 108000 HTTP req ...
Haproxy 1.4-dev2: barrier of 100k HTTP req/s crossed
gen_server在erlang otp编程中的地位是无可撼动的,几乎都是gen_server或者gen_fsm的模型。那么程序运行起来的时候 我们如何查看gen_server的内部状态呢。有2种方法:
1. 自己写个类似于info这样的函数,来获取状态。
2. 利用系统现有的架构。sasl应用带了一个si的东西 全名是status inspector, 这个东西就是设计来帮用户解决这个问题的。
实验开始:
root@nd-desktop:~# cat abc.erl
-module(abc).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([format_status/2]).
-export([test/0]).
-record(state, {a, b}).
-define(SERVER, ?MODULE).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
test()->
gen_server:call(?SERVER, {test, "param1"}).
init([]) ->
{ok, #state{a=hello, b=world}}.
handle_call({test, _} = Request, _From, State) ->
io:format("got msg ~p~n", [Request]),
{reply, ok, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
format_status(_Opt, [_PDict, #state{a=A,
b = B
}]) ->
[{data, [{"a===", A},
{"b===", B}]}].
root@nd-desktop:~# erl -boot start_sasl
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.35.0>},
{name,alarm_handler},
{mfa,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.36.0>},
{name,overload},
{mfa,{overload,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.34.0>},
{name,sasl_safe_sup},
{mfa,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.37.0>},
{name,release_handler},
{mfa,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
application: sasl
started_at: nonode@nohost
Eshell V5.7.4 (abort with ^G)
1> si:start(). %必须手动启动
=PROGRESS REPORT==== 29-Oct-2009::16:07:31 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.43.0>},
{name,si_server},
{mfa,{si_sasl_supp,start_link,[[]]}},
{restart_type,temporary},
{shutdown,brutal_kill},
{child_type,worker}]
{ok,<0.43.0>}
2> si:help().
Status Inspection tool - usage
==============================
For all these functions, Opt is an optional argument
which can be 'normal' or 'all'; default is 'normal'.
If 'all', all information will be printed.
A Pid can be: "<A.B.C>", {A, B, C}, B, a registered_name or an abbrev.
ANY PROCESS
si:pi([Opt,] Pid) - Formatted information about any process that
SI recognises.
si:pi([Opt,] A,B,C) - Same as si:pi({A, B, C}).
si:ppi(Pid) - Pretty formating of process_info.
Works for any process.
MISC
si:abbrevs() - Lists valid abbreviations.
si:start_log(Filename) - Logging to file.
si:stop_log()
si:start() - Starts Status Inspection (the si_server).
si:start([{start_log, FileName}])
si:stop() - Shut down SI.
ok
3> abc:start_link().
{ok,<0.46.0>}
4> abc:test().
got msg {test,"param1"}
ok
5> sys:log(abc,true). %打开gen_server的消息log功能
ok
6> abc:test(). %这个请求消息被记录
got msg {test,"param1"}
ok
7> si:pi(abc). %好戏开始
Status for generic server abc
===============================================================================
Pid <0.46.0>
Status running
Parent <0.41.0>
Logged events %这个是log到的消息
{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},{test,"param1"}}},
abc,
{gen_server,print_event}}]}
%这个是format_status的结果 如果没有format_status那么导出是 {a=hello, b=world}
a=== hello
b=== world
ok
8> si:ppi(abc).
Pretty Process Info
-------------------
[{registered_name,abc},
{current_function,{gen_server,loop,6}},
{initial_call,{proc_lib,init_p,5}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[<0.41.0>]},
{dictionary,[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,9},
{reductions,117},
{garbage_collection,[{fullsweep_after,65535},{minor_gcs,0}]},
{suspending,[]}]
ok
9> sys:get_status(abc). %当然你也可以这么看
{status,<0.46.0>,
{module,gen_server},
[[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}],
running,<0.41.0>,
[{log,{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},
{test,"param1"}}},
abc,
{gen_server,print_event}}]}}],
[abc,{state,hello,world},abc,infinity]]}
结论:
这个是文档未公开的功能。上面演示了如何sys打开log, 如何察看gen_server的状态
1. 自己写个类似于info这样的函数,来获取状态。
2. 利用系统现有的架构。sasl应用带了一个si的东西 全名是status inspector, 这个东西就是设计来帮用户解决这个问题的。
实验开始:
root@nd-desktop:~# cat abc.erl
-module(abc).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-export([format_status/2]).
-export([test/0]).
-record(state, {a, b}).
-define(SERVER, ?MODULE).
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
test()->
gen_server:call(?SERVER, {test, "param1"}).
init([]) ->
{ok, #state{a=hello, b=world}}.
handle_call({test, _} = Request, _From, State) ->
io:format("got msg ~p~n", [Request]),
{reply, ok, State};
handle_call(_Request, _From, State) ->
Reply = ok,
{reply, Reply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
format_status(_Opt, [_PDict, #state{a=A,
b = B
}]) ->
[{data, [{"a===", A},
{"b===", B}]}].
root@nd-desktop:~# erl -boot start_sasl
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.35.0>},
{name,alarm_handler},
{mfa,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.36.0>},
{name,overload},
{mfa,{overload,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.34.0>},
{name,sasl_safe_sup},
{mfa,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.37.0>},
{name,release_handler},
{mfa,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 29-Oct-2009::16:07:24 ===
application: sasl
started_at: nonode@nohost
Eshell V5.7.4 (abort with ^G)
1> si:start(). %必须手动启动
=PROGRESS REPORT==== 29-Oct-2009::16:07:31 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.43.0>},
{name,si_server},
{mfa,{si_sasl_supp,start_link,[[]]}},
{restart_type,temporary},
{shutdown,brutal_kill},
{child_type,worker}]
{ok,<0.43.0>}
2> si:help().
Status Inspection tool - usage
==============================
For all these functions, Opt is an optional argument
which can be 'normal' or 'all'; default is 'normal'.
If 'all', all information will be printed.
A Pid can be: "<A.B.C>", {A, B, C}, B, a registered_name or an abbrev.
ANY PROCESS
si:pi([Opt,] Pid) - Formatted information about any process that
SI recognises.
si:pi([Opt,] A,B,C) - Same as si:pi({A, B, C}).
si:ppi(Pid) - Pretty formating of process_info.
Works for any process.
MISC
si:abbrevs() - Lists valid abbreviations.
si:start_log(Filename) - Logging to file.
si:stop_log()
si:start() - Starts Status Inspection (the si_server).
si:start([{start_log, FileName}])
si:stop() - Shut down SI.
ok
3> abc:start_link().
{ok,<0.46.0>}
4> abc:test().
got msg {test,"param1"}
ok
5> sys:log(abc,true). %打开gen_server的消息log功能
ok
6> abc:test(). %这个请求消息被记录
got msg {test,"param1"}
ok
7> si:pi(abc). %好戏开始
Status for generic server abc
===============================================================================
Pid <0.46.0>
Status running
Parent <0.41.0>
Logged events %这个是log到的消息
{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},{test,"param1"}}},
abc,
{gen_server,print_event}}]}
%这个是format_status的结果 如果没有format_status那么导出是 {a=hello, b=world}
a=== hello
b=== world
ok
8> si:ppi(abc).
Pretty Process Info
-------------------
[{registered_name,abc},
{current_function,{gen_server,loop,6}},
{initial_call,{proc_lib,init_p,5}},
{status,waiting},
{message_queue_len,0},
{messages,[]},
{links,[<0.41.0>]},
{dictionary,[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}]},
{trap_exit,false},
{error_handler,error_handler},
{priority,normal},
{group_leader,<0.25.0>},
{total_heap_size,233},
{heap_size,233},
{stack_size,9},
{reductions,117},
{garbage_collection,[{fullsweep_after,65535},{minor_gcs,0}]},
{suspending,[]}]
ok
9> sys:get_status(abc). %当然你也可以这么看
{status,<0.46.0>,
{module,gen_server},
[[{'$ancestors',[<0.41.0>]},{'$initial_call',{abc,init,1}}],
running,<0.41.0>,
[{log,{10,
[{{out,ok,<0.41.0>,{state,hello,world}},
abc,
{gen_server,print_event}},
{{in,{'$gen_call',{<0.41.0>,#Ref<0.0.0.85>},
{test,"param1"}}},
abc,
{gen_server,print_event}}]}}],
[abc,{state,hello,world},abc,infinity]]}
结论:
这个是文档未公开的功能。上面演示了如何sys打开log, 如何察看gen_server的状态
发表评论
-
OTP R14A今天发布了
2010-06-17 14:36 2676以下是这次发布的亮点,没有太大的性能改进, 主要是修理了很多B ... -
R14A实现了EEP31,添加了binary模块
2010-05-21 15:15 3030Erlang的binary数据结构非常强大,而且偏向底层,在作 ... -
如何查看节点的可用句柄数目和已用句柄数
2010-04-08 03:31 4813很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
获取Erlang系统信息的代码片段
2010-04-06 21:49 3475从lib/megaco/src/tcp/megaco_tcp_ ... -
iolist跟list有什么区别?
2010-04-06 20:30 6529看到erlang-china.org上有个 ... -
erlang:send_after和erlang:start_timer的使用解释
2010-04-06 18:31 8386前段时间arksea 同学提出这个问题, 因为文档里面写的很不 ... -
Latest news from the Erlang/OTP team at Ericsson 2010
2010-04-05 19:23 2013参考Talk http://www.erlang-factor ... -
对try 异常 运行的疑问,为什么出现两种结果
2010-04-05 19:22 2841郎咸武<langxianzhe@163.com> ... -
Erlang ERTS Async基础设施
2010-03-19 00:03 2517其实Erts的Async做的很不错的, 相当的完备, 性能又高 ... -
CloudI 0.0.9 Released, A Cloud as an Interface
2010-03-09 22:32 2474基于Erlang的云平台 看了下代码 质量还是不错的 完成了不 ... -
Memory matters - even in Erlang (再次说明了了解内存如何工作的必要性)
2010-03-09 20:26 3439原文地址:http://www.lshift.net/blog ... -
Some simple examples of using Erlang’s XPath implementation
2010-03-08 23:30 2050原文地址 http://www.lshift.net/blog ... -
lcnt 环境搭建
2010-02-26 16:19 2613抄书:otp_doc_html_R13B04/lib/tool ... -
Erlang强大的代码重构工具 tidier
2010-02-25 16:22 2485Jan 29, 2010 We are very happy ... -
[Feb 24 2010] Erlang/OTP R13B04 has been released
2010-02-25 00:31 1387Erlang/OTP R13B04 has been rele ... -
R13B04 Installation
2010-01-28 10:28 1389R13B04后erlang的源码编译为了考虑移植性,就改变了编 ... -
Running tests
2010-01-19 14:51 1485R13B03以后 OTP的模块加入了大量的测试模块,这些模块都 ... -
R13B04在细化Binary heap
2010-01-14 15:11 1508从github otp的更新日志可以清楚的看到otp R13B ... -
R13B03 binary vheap有助减少binary内存压力
2009-11-29 16:07 1667R13B03 binary vheap有助减少binary内存 ... -
erl_nif 扩展erlang的另外一种方法
2009-11-26 01:02 3218我们知道扩展erl有2种方法, driver和port. 这2 ...
相关推荐
此驱动确保了iLO功能在SERVER 2008 R2中的正常运行,提供电源管理、温度监控、硬件健康状态检查等一系列管理服务。 2. 4_cp022059_ iLO interface_系统管理.exe:这可能是iLO的接口驱动,用于连接和通信,使得用户...
- **Gen_Server 行为**:文档中未给出具体细节,但通常涉及服务器进程的设计和实现。 - **Gen_Fsm 行为** - **有限状态机**:介绍了如何使用Gen_Fsm实现状态机逻辑。 - **示例**:提供了Gen_Fsm的具体用法示例。 ...
最后,HPE DL380 Gen10用户指南还详细介绍了如何使用Systems Insight Display,这是一个系统管理显示界面,用于提供服务器状态的实时反馈和故障诊断信息。它还包含了服务器的物理安装、检查备用电池电量、安装高性能...
压缩包中的"cp040561.exe"和"cp040013.exe"可能是网卡驱动文件,用于支持HPE DL388 Gen10内置的网络接口控制器(NIC),提高网络连接速度和稳定性,支持高级功能如负载均衡、故障切换等。 2. **主板芯片组驱动**: ...
- 使用Erlang的`gen_server`行为模式编写服务进程,处理连接请求、数据收发等任务。 5. **文件结构**: - `tcp_client-master`可能包含源代码文件,如`.erl`文件,用于实现TCP客户端功能。 - 可能还有测试用例...
在HPE Gen10服务器中,通常会配备支持高级RAID级别的智能阵列卡(HPE Smart Array),如P408i-a SR、P410i、HPE Smart Array S100i等。这些阵列卡不仅提供硬件加速的RAID功能,还具有BBU(Battery Backup Unit)电池...
- 在HP ProLiant DL388p Gen8中,磁盘阵列驱动用于管理RAID(冗余磁盘阵列)控制器,如Smart Array系列。这些驱动支持创建不同级别的RAID配置,如RAID 0, 1, 5, 6等,以实现数据冗余和性能优化。它们还负责监控硬盘...
- **2.2 Gen_Server Behaviour**:文档缺失,未提供具体细节。 - **2.3 Gen_Fsm Behaviour**:讲解如何使用有限状态机行为。 - **2.3.1 有限状态机**:Erlang中的Gen_Fsm行为允许实现有限状态机。 - **2.3.2 实例*...
2. OTP框架:理解其模块化设计、行为(gen_server, gen_event等)、分布式应用和系统监控。 3. RabbitMQ基本概念:掌握消息队列的工作原理、交换器(exchanges)、队列(queues)、绑定(bindings)以及消费者...
"HP Gen8_32bit_Server_basicDrive"这个压缩包文件很可能包含了适用于32位版本Windows Server 2003的HP DL388 G8主板驱动。这些驱动可能包括以下关键组件: 1. BIOS(基本输入输出系统):这是服务器启动时运行的第...
### HP ProLiant DL380 G6 服务器 - 安装 Windows Server 2008 X64 操作系统 #### 知识点一:HP ProLiant DL380 G6 服务器简介 HP ProLiant DL380 G6 是一款企业级服务器,具有出色的性能和可扩展性,适用于各种...
例如,Gen_Server和Gen_Fsm都是Erlang OTP提供的行为模式,它们定义了处理消息的基本结构,并要求开发者实现与具体逻辑相关的回调函数。 应用(Application)在Erlang/OTP中是一个封装了代码、模块、资源文件和配置...
OTP(Open Telecom Platform)提供了诸如gen_server这样的行为模式,简化了分布式系统中的位置透明性和容错机制。 **Mnesia 分布数据库** Mnesia 是Erlang的分布式数据库系统,适合读多写少的场景。它提供了软实时...
7. **OTP(Open Telecom Platform)**:Erlang OTP是一套标准库和设计原则,提供了如gen_server、gen_event等行为模式,帮助开发者遵循良好的软件工程实践。 在《Erlang编程指南》这本书中,作者Francesco Cesarini...
5. **操作系统支持**:这些驱动程序适用于Windows Server 2012 R2、2016和2019,这些都是微软发布的主流企业级操作系统,为服务器提供了稳定的平台,广泛应用于各种企业环境。 6. **驱动程序的重要性**:驱动程序是...
3. **OTP(Open Telecom Platform)框架**:OTP是Erlang的标准库,提供了许多预定义的行为(Behaviours),如gen_server、gen_event和supervisor,它们是构建可靠系统的基石。理解这些行为及其使用方式是Erlang...