zoukankan      html  css  js  c++  java
  • 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:

    longname:

    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

  • 相关阅读:
    动手动脑之异常处理
    git一些概念
    jquery each函数使用
    数据库客户端
    plotly.js
    网站跳转汇总
    jquery 实现间隔运行
    学习 在线调试
    Robot限制字典的key大写的class
    Gerrit 相关
  • 原文地址:https://www.cnblogs.com/haoqingchuan/p/4666197.html
Copyright © 2011-2022 走看看