如何在Erlang中停止或重新连接节点?

时间:2017-10-26 16:50:39

标签: erlang

我是Erlang的新手。

目前,我创建了一个模块,可以帮助我将用户请求转发到apns库。

我创建了一个gen_server模块并将其添加到主管。

今天,当我使用erl -sname apns_server启动我的模块时。

一切正常。但是我要暂停终端一段时间,连接已被服务器关闭。

然后问题发生了。在与服务器建立新连接后,我可以启动一个新的erl -sname apns_server。

错误消息表示已存在apns_server。我确实在epmd -names中看到了服务器名称。

节点处于活动状态,因为我可以通过rpc:call来发送请求来运行请求。但我不知道如何阻止它!!

该模块的费用仍在开发中,我需要更新一些代码然后重新启动它。我怎样才能做到这一点?在同一台机器上运行其他Erlang服务的费用,我无法重启系统。还有其他方法可以阻止我的模块的Erlang节点吗? 谢谢~~

埃里克

1 个答案:

答案 0 :(得分:2)

连接到现有节点:

  1. ssh到您的服务器。
  2. 使用新名称启动新的Erlang节点+ shell会话,但与您要联系的节点cookie 相同(erl -name some_name -cookie some_cookie)。
  3. 从新的Erlang shell中按^G(即CTRL+G)打开终端命令界面。
  4. 输入命令字符串r other_node_name@node.host以远程连接到另一个节点。
  5. j列出当前作业。将列出您尝试联系的节点上生成的新shell。
  6. 输入c [the remote shell's job number]以连接到您要使用的节点上的新shell。
  7. 这是我的第一个节点,名为'foo@changa.shinden.tsuriai.jp'

    ceverett@changa:~$ erl -name foo -cookie bar
    Erlang/OTP 20 [RELEASE CANDIDATE 2] [erts-9.0] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]
    
    Eshell V9.0  (abort with ^G)
    (foo@changa.shinden.tsuriai.jp)1>
    

    这是我的第二个节点,名为'baz@changa.shinden.tsuriai.jp',我将用它来启动另一个节点的远程shell连接。请注意,我已使用相同的 Cookie(选项-cookie bar)启动此erl会话,如上所述:

    ceverett@changa:~$ erl -name baz -cookie bar
    Erlang/OTP 20 [RELEASE CANDIDATE 2] [erts-9.0] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]
    
    Eshell V9.0  (abort with ^G)
    (baz@changa.shinden.tsuriai.jp)1>
    User switch command
     --> ?
      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 'foo@changa.shinden.tsuriai.jp'
     --> j
       1  {shell,start,[init]}
       2* {'foo@changa.shinden.tsuriai.jp',shell,start,[]}
     --> c 2
    Eshell V9.0  (abort with ^G)
    (foo@changa.shinden.tsuriai.jp)1>
    

    注意我的提示是如何在底部更改的?这就是它的全部内容。

    这适用于在群集中连接的任何Erlang节点,并且使用长节点名称运行的EPMD如果远程节点能够在网络上看到彼此,则会尝试相互连接。在这种情况下,两个节点都在同一主机上运行,​​但只要主机可以在网络上看到对方,它就会以相同的方式工作。