erlang调试之JCL

Job control mode (JCL), in which jobs can be started, stopped, detached or connected. Only the current job can communicate with the shell.

通过JCL,我们可以远程接入一个erlang node,来对其进行访问控制

erlang节点之间通信是需要有互信的,而互信是用cookie来完成,所以要对其他节点进行访问我们需要获得对方cookie

首先我们有一个这样的运行的erlang 节点[email protected],ps 查进程时未发现其使用set_cookie,则可以借助rabbitmqctl eval "erlang:get_cookie()."来获取,由于显示设置,所以结果是一个随机值。

[email protected]:~$ sudo ps -ef |grep rab
rabbitmq 1598 1558 0 06:19 ? 00:00:22 /usr/lib/erlang/erts-5.10.4/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib/erlang -progname erl -- -home /var/lib/rabbitmq -- -pa /usr/lib/rabbitmq/lib/rabbitmq_server-3.2.4/sbin/../ebin -noshell -noinput -s rabbit boot -sname [email protected] -boot start_sasl -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -sasl sasl_error_logger false -rabbit error_logger {file,"/var/log/rabbitmq/[email protected]"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/[email protected]"} -rabbit enabled_plugins_file "/etc/rabbitmq/enabled_plugins" -rabbit plugins_dir "/usr/lib/rabbitmq/lib/rabbitmq_server-3.2.4/sbin/../plugins" -rabbit plugins_expand_dir "/var/lib/rabbitmq/mnesia/[email protected]" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/[email protected]"

[email protected]:~$ sudo rabbitmqctl eval "erlang:get_cookie()."
‘GEKQFELMYVCURLSDQCYI‘
...done.

然后启动一个erlang节点,设置cookie,尝试ping下要连接的节点

[email protected]:~$ erl -sname [email protected]
Erlang R16B03 (erts-5.10.4) [source] [smp:4:4] [async-threads:10] [kernel-poll:false]

Eshell V5.10.4 (abort with ^G)
([email protected])1> erlang:set_cookie(node(),GEKQFELMYVCURLSDQCYI).
* 1: variable ‘GEKQFELMYVCURLSDQCYI‘ is unbound
([email protected])2> erlang:set_cookie(node(),‘GEKQFELMYVCURLSDQCYI‘).
true
([email protected])3> net_adm:ping(‘[email protected]‘).
pong

接入某节点有我了解的两种方式,一个是使用net_kernel:connect_node(Nodename),另一个是使用JCL的r命令,此处我们使用后者

CTL+g进入 JCL模式

User switch command
--> h
c [nn] - connect to job
i [nn] - interrupt job
k [nn] - kill job
j - list all jobs
s [shell] - start local shell
r [node [shell]] - start remote shell
q - quit erlang
? | h - this message
--> r ‘[email protected]‘               %%l连接[email protected]
--> j                                                                     %%job列表中可以看到有我们连接的节点
1 {shell,start,[init]}
2* {‘[email protected]‘,shell,start,[]}
--> c 2                                                                       %%切换到job 2,这样就成功接入了[email protected]

Eshell V5.10.4 (abort with ^G)
([email protected])1>

之后我们就可以查询进程调用栈,内存使用情况,长期等待消息进程来进行调试。

疑问:

1.节点名sname和name的区别

2.启动节点时显示用set_cookie设置cookie不生效,而创建之后使用erlang:set_cookie(XX, bb).可行

时间: 07-19

erlang调试之JCL的相关文章

erlang调试方法

第一种方式,加打印记录 %%-define(debug, ok). -ifdef(debug). -define(LOG(X), io:format("pid:~p , {~p,~p}: ~p~n", [self(), ?MODULE, ?LINE, X])). -else. -define(LOG(X), true). -endif. 设置LOG的宏定义,调试只要在代码中加入?LOG(Val),就可以 特点是,简单,调试清楚,对代码性能的影响小,也是最常用的方法,就不举例说明了 第二

硝烟中的Erlang -- Erlang生产系统问题诊断、调试、解决指南

英文原名:Stuff Goes Bad: Erlang In Anger 英文作者:FRED HEBERT 下载地址:http://vdisk.weibo.com/s/iGQ-rFuJU0-4 译者序 在我近20年的软件开发工作中,除了Erlang,还使用过许多其他编程语言.有工作需要的C/C++.Java,也有作为业余爱好使用的Lisp.Haskell.Scala等,其中我最喜欢的当属Erlang.除了因为我的电信软件开发背景外,还有一个很重要的原因是Erlang独特的设计哲学和解决问题方式.

接入Erlang控制台的几种方法

在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离终端:      -detached Starts the Erlang runtime system detached from the system console. Useful for running daemons and backgrounds processes. Implies -n

Erlang 104 OTP - incomplete

笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明 2014-12-21 A Outline, 1 Agenda 0 Scope 围绕OTP设计原则,分别记录行为模式.监督树概念.应用.发布和部署,以及[3]中一个产品级缓存解决方案. 1 OTP Design Principles Erlang Doc: OTP Design Principles User's Guide OTP设计原则阐述的是如

一位Erlang程序猿的自白

12.00 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority

erlang shell 命令中文使用手册

转载自--没有开花的树:http://blog.csdn.net/mycwq/article/details/16858805 整理的很完整,所以拿过来了, erlang shell 是在命令行模式下使用命令和 erlang 交互的工具.erlang shell功能十分强大,可以直接编译.加载.执行.调试模块等等,完全可以将shell做为erlang项目的终端使用.文章将对erlang shell 命令做介绍,还简单以示例说明. 打开erlang shell的帮助信息,在这里变成中文了.同时可以

Android Studio 调试技巧

转载自: http://tianweishu.com/2015/12/21/Android-studio-debug-tips-you-may-not-know/ 写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点:可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field

Erlang tool -- lager overload protection

log 这个事, 说大不大说小又不小. 大点的, 可以用scribe flume 这样的系统去做, 小点的, 也就打印一个调试信息而已. 在Erlang 中, log 这事情确实比较伤, error_logger 是个单点, io:format 容易导致节点崩溃. 在开源社区, lager 算是使用比较广泛的一个, 然而, 同样不能完全避免单点的问题. 因为在lager 中, lager_event 作为 core, 是单个进程存在的. 1 dispatch_log(Severity, Meta

[Erl_Question18]教练!又发现Erlang Shell里面的神奇函数一只

人嘛,总是想提高效率,创造更多的价值,同时也得到更多的选择空间.可一个人的精力,时间终归是有限的,减少自身重复或无意义工作就显得格外重要! 要么懂得授权,要么把重复的工作交给机器来做: 现实: 美国人喜欢把不重要的开发外包给其它国家,自己做核心; 身边:上级们不都是把他们认为不值得亲自做的事派发给下级,自己留精力去琢磨更重要的事么? 但苦逼如我,根本木有授权,所以只好费劲心思想尽办法让机器来做. 所以我先从工作调试用得最多的就是shell里面下手,有必要重温下c.erl这个模块,看文档真是"磨刀