如何重启一个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 使用它