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 节点rabbit@mainred-ThinkPad-E420,ps 查进程时未发现其使用set_cookie,则可以借助rabbitmqctl eval "erlang:get_cookie()."来获取,由于显示设置,所以结果是一个随机值。
mainred@mainred-ThinkPad-E420:~$ 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 rabbit@mainred-ThinkPad-E420 -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/rabbit@mainred-ThinkPad-E420.log"} -rabbit sasl_error_logger {file,"/var/log/rabbitmq/rabbit@mainred-ThinkPad-E420-sasl.log"} -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/rabbit@mainred-ThinkPad-E420-plugins-expand" -os_mon start_cpu_sup false -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@mainred-ThinkPad-E420"
mainred@mainred-ThinkPad-E420:~$ sudo rabbitmqctl eval "erlang:get_cookie()."
'GEKQFELMYVCURLSDQCYI'
...done.
然后启动一个erlang节点,设置cookie,尝试ping下要连接的节点
mainred@mainred-ThinkPad-E420:~$ erl -sname test@mainred-ThinkPad-E420
Erlang R16B03 (erts-5.10.4) [source] [smp:4:4] [async-threads:10] [kernel-poll:false]
Eshell V5.10.4 (abort with ^G)
(test@mainred-ThinkPad-E420)1> erlang:set_cookie(node(),GEKQFELMYVCURLSDQCYI).
* 1: variable 'GEKQFELMYVCURLSDQCYI' is unbound
(test@mainred-ThinkPad-E420)2> erlang:set_cookie(node(),'GEKQFELMYVCURLSDQCYI').
true
(test@mainred-ThinkPad-E420)3> net_adm:ping('rabbit@mainred-ThinkPad-E420').
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 'rabbit@mainred-ThinkPad-E420' %%l连接rabbit@mainred-ThinkPad-E420
--> j %%job列表中可以看到有我们连接的节点
1 {shell,start,[init]}
2* {'rabbit@mainred-ThinkPad-E420',shell,start,[]}
--> c 2 %%切换到job 2,这样就成功接入了rabbit@mainred-ThinkPad-E420
Eshell V5.10.4 (abort with ^G)
(rabbit@mainred-ThinkPad-E420)1>
之后我们就可以查询进程调用栈,内存使用情况,长期等待消息进程来进行调试。
疑问:
1.节点名sname和name的区别
sname和name起动参数的区别主要体现在格式上
short name:
- erl -sname Name
- erl -sname Name@ShortHost
longname:
- erl -name Name
- erl -name Name@ShortHost
- erl -name Name@FullHost
Name :: atom() || string()
ShortHost :: atom() || string(), 不可含有"."。比如"myhost"
FullHost :: [ShortHost()] || Ip, 比如"test.mydomain.com"和"8.34.135.3"
Erlang节点short name和long name. http://blog.csdn.net/cntway/article/details/7679170
erlang调试之JCL的更多相关文章
- erlang调试技术之etop
etop是erlang进程信息查看工具,类似于UNIX的top. 一.配置参数 node The measured node. Value: atom() Mandatory setcookie Co ...
- erlang调试方法
第一种方式,加打印记录 %%-define(debug, ok). -ifdef(debug). -define(LOG(X), io:format("pid:~p , {~p,~p}: ~ ...
- Erlang语言介绍
Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...
- 《Erlang程序设计(第2版)》
<Erlang程序设计(第2版)> 基本信息 作者: (瑞典)Joe Armstrong 译者: 牛化成 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115354 ...
- erlang的调试配置
distel可以断点调试erlang,但是步骤非常繁琐 以下面的测试脚本为例说明 geometry.erl -module(geometry). -export([area/1]). area({re ...
- Erlang Shell调试网络程序真方便
Erlang的shell功能强大,这里我将它当成我的客户端.可以动态的输入你需要发送的内容,也可以动态的接收内容,就像调试器一样,在开发过程中起到很重要的作用.具体使用方式如下: C:\Documen ...
- 本机连接调试Erlang结点与rebar3编译
今天需要实时查看目标结点上的相关信息,于是查阅了关于远程Shell使用的资料,最终采用JCL的方式与本机上的erlang结点交互.在使用erl shell时需要指定目标结点的cookie以及当前结点名 ...
- 接入Erlang控制台的几种方法
在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离 ...
- Erlang 学习笔记
http://wenku.baidu.com/link?url=AUQR8Hn-e-fEB_lqjXsd8XfapWj1qAK7J05JoBXFib_LlSk5qSOTia8HIxNV1XkeZi-k ...
随机推荐
- MySQL分库分表总结
单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...
- sqlserver中分区函数 partition by的用法
partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录, partition by ...
- myeclipse如何设置字体?
1.首先,将你的Myeclipse打开. 找到上面的菜单“windows”打开“Preferences” 2.然后,在弹出的设置窗口中找到“colors and fonts” 3.将右边的basic打 ...
- Java基本数据类型与位运算
>>赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明 ...
- 标准模板库(STL)的一个 bug
今天敲代码的时候遇到 STL 的一个 bug,与 C++ 的类中的 const 成员变量有关.什么,明明提供了默认的构造函数和复制构造函数,竟然还要类提供赋值运算符重载.怎么会这样? 测试代码 Tes ...
- 带callback的future实现
jdk暂时不支持,所以只有自己实现带callback的future. 完成后callback的 final TaskPromise promise = new DefaultTaskPromise() ...
- 数据库错误:check the manual that corresponds to your MySQL server version for the right sy
检查对应到您的MySQL服务器版本附近使用正确的语法手册 数据库插入的时候出现上述问题,总结了两方面原因: 1.语法错误,这是百度之得到的大部分结果,但是没有解决我的问题 2.仔细观察我的sql语句, ...
- JavaScript老梗之this对象
Js中的this关键词貌似是初学者必经的坑 都不例外 我们经常听到其他人说 this对象谁调用指向谁 的确这是最容易理解的 但是我们可以更加深入的去探索下 加深印象以便更加灵活的适用它 这里不得不提下 ...
- 各种解析漏洞获取Webshell
各种解析漏洞拿shell 一.IIS 6.0解析漏洞 IIS 6.0解析利用方法有两种1.目录解析/xx.asp/xx.jpg2.文件解析wooyun.asp;.jpg第一种,在网站下建立文件夹的名 ...
- Java基础知识梳理《一》
一.Java数据类型(简单称之为“四类八种”) java 基本的数据类型长度都是固定的,好处是在实现跨平台时就统一了. 1.整型 byte short int long (分别是1,2,4,8个字节) ...