8

我已经使用 basho rebar 编译了我的 Erlang 应用程序,它制作了一个独立的 escript 可执行文件。我从命令行运行它,例如: ./myapp myconfig.config

我的问题是如何确定运行我的应用程序的 Erlang 节点名称。当在我的应用程序中运行“node()”命令时,它默认返回“nonode@nohost”,但我想将我的名字指定给该节点(例如 mynode@domain.com),所以当我运行“node()”时在我的应用程序中,我喜欢看到“mynode@domain.com”而不是“nonode@nohost”

我知道“erlang -name 'mynode@domain.com'”,但请考虑我从命令行运行应用程序。我认为 Erlang VM 在应用程序生命周期内会自动运行和终止。

4

3 回答 3

19

最好的方法当然是通过“-sname node”或“-name node@host”在命令行中设置nodename。但也可以改用“net_kernel”模块。它在http://www.erlang.org/doc/man/net_kernel.html中有描述

$ erl
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
1> node().
nonode@nohost
2> net_kernel:start([rumata, shortnames]).
{ok,<0.34.0>}
(rumata@rumata-osx)3> node().
'rumata@rumata-osx'
(rumata@rumata-osx)4> net_kernel:stop().
ok
5> node().
nonode@nohost
6> net_kernel:start(['rumata@myhost', longnames]). 
{ok,<0.44.0>}
(rumata@myhost)7> node().
rumata@myhost
于 2012-12-29T07:30:08.287 回答
0

您可以使用神奇的“模拟器参数”行(如escript 文档中所述)。例如:

#!/usr/bin/env escript
%%! -sname ohai

main(_Args) ->
    io:format("I am: ~p~n", [node()]).

-prefixed%%!行被视为erl在命令行上传递给它,允许您从那里指定节点名称。

于 2012-12-29T22:45:51.487 回答
0

我查看了一个使用钢筋(氮)分发的应用程序。它们使用参数 -args_file 在配置文件中传递大部分 vm 参数:

erts-5.9\bin\werl -pa %PA% -boot releases/2.1.0/nitrogen -embedded -config etc/app.generated.config  -args_file etc/vm.args

并且在 vm.args 中只需使用参数 -name 来定义节点名称:

-name nitrogen@127.0.0.1
于 2012-12-29T07:48:17.787 回答