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 ...
随机推荐
- [Sass]命令编译
[Sass]命令编译 命令编译是指使用你电脑中的命令终端,通过输入 Sass 指令来编译 Sass.这种编译方式是最直接也是最简单的一种方式.因为只需要在你的命令终端输入: 单文件编译: sass & ...
- Redis学习笔记8--Redis发布/订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者 ...
- jdbc连接数据库(mysql,sqlserver,oracle)
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...
- SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)
一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified) File Name: cn_sq ...
- web前端学习部落22群分享给需要前端练手项目
前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程, ...
- 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...
- EasyAR 开发教程系列1--小试牛刀
大家好,我是Albert Lee(@Mars Studio),AR独立开发者.计算机视觉与人工智能研究者. AR 开发资源汇总(不断更新中):https://github.com/GeekLiB 微信 ...
- react native TextInput
今天我想说一下react native中的一个控件,TextInput 翻译过来就是文本输入,对应着android中的EditText.我们先看一下官方是怎样描述的.TextInput是一个允许用户在 ...
- B站开源ijkplayer 等多个项目
弹幕视频网 Bilibili(B 站)近日在 GitHub 网站上建立了开源工作组(BOSTF),用以分享与维护自己的开源项目,其中包括 DanmakuFlameMaster(燃烧吧!烈焰弹幕使)与 ...
- Android_AsyncTask异步任务(一)
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI ...