如何重启一个erlang节点?

Posted

技术标签:

【中文标题】如何重启一个erlang节点?【英文标题】:How to restart an erlang node? 【发布时间】:2015-11-29 15:05:17 【问题描述】:

我有一个示例 git push github

它是《Programming Erlang》一书中的一个应用示例

你可以关注README.md

我的问题是应用程序 sellaprime 什么时候开始的,而我

./bin/sp restart

这会让节点宕机而不重启?

Erlang Doc说

系统在运行中的Erlang节点内部重启,这意味着模拟器没有重启。所有应用程序都被顺利关闭,所有代码都被卸载,所有端口都被关闭,然后以与最初启动相同的方式再次启动系统。再次使用相同的 BootArgs。

“模拟器未重新启动”是什么意思?

如果我想重启一个节点,正确的做法是什么?

顺便问一下,有没有API可以知道当前的发布版本,比如

application:which_applications()

【问题讨论】:

【参考方案1】:

看起来您的sb 初始化脚本,即使用nodetool 脚本应该为您调用init:restart()。如果这样做了,但您的节点反而关闭了,请检查您的日志是否有任何可能的错误(也许您的某个应用程序无法处理重新启动?)。

使用init:restart() 是这样做的方法。这是一个示例:使用名称(在本例中为 test)启动一个 Erlang 节点:

$ erl -sname test
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
(test@host)1> hello.
hello
(test@host)2> 

临时启动另一个将对第一个节点进行 RPC 调用的节点:

$ erl -sname other -noinput -noshell -eval "rpc:call('test@host', init, restart, [])" -s init stop
$

观察被重启的原节点:

(test@host)2> Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.0  (abort with ^G)
(test@host)1>

【讨论】:

我得到了日志 "init terminating in do_boot",'cannot load',asn1rt_nif,get_files 。这是怎么发生的?还有为什么会放出asn1rt,其实我并没有在reltool.config中配置 也许您的某个应用程序依赖于它?

以上是关于如何重启一个erlang节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何连接到已注册的节点(Erlang)并从另一个 erlang 应用程序中使用它

如何连接到已注册的节点(Erlang)并从 Ejabberd 使用它

运行 N 个 Erlang 节点并使用 bash 脚本在每个节点中执行一行

Erlang:不允许的节点/也许 Cookie 问题

Erlang 分布式 - 一些节点共享 1 个应用程序

Phoenix/Erlang 节点连接