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
最新文章
- nginx ssl 更换问题
- pthread_cond_wait()函数的理解(摘录)
- 推荐几个jQuery插件
- nios II--实验4——按键中断软件部分
- fastx_toolkit去除测序数据中的接头和低质量的reads
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数006, image,影像处理(像素图)
- 离线安装Cloudera Manager 5和CDH5(最新版5.1.3) 完全教程
- C# Out 传值
- 《samba搭建win客户端和linux客户端的区别》
- hdu 5094 Maze 状态压缩dp+广搜
- C# 验证码识别基础方法及源码
- SQLSERVER一些公用DLL
- ARC使用小结
- this指向(匿名函数问题)
- ConcurrentHashMap源码分析(一)
- [ Java面试题 ]泛型篇
- DDD - 概述 - 聚合 - 限界上下文 (四)
- php 将图片转成base64
- github提交代码contributions不显示小绿块
- SimpleChannelInboundHandler与ChannelInboundHandlerAdapter
热门文章
- 转一篇介绍Web session概念的文章
- 【python】装饰器
- NavigationController
- Java Mysql连接池配置和案例分析--超时异常和处理
- C++中动态内粗分配new标识符的使用
- 解决Delphi图形化界面的TEdit、TLable等组件手动拖拽固定大小,但是编译之后显示有差别的情况
- 解决Yii2 启用_csrf验证后POST数据仍提示“您提交的数据无法验证”
- 一、Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
- JS高级程序设计笔记一
- iOS中获取各种文件的目录路径的方法