在引导时动态设置节点名称

时间:2014-07-23 17:21:55

标签: erlang relx

我正在使用relx构建我的版本,我无法使用默认的-sname someuser@127.0.0.1。 相反,我想做一些像-sname someuser @`hostname -i`这样的东西,以便在启动时定义节点的公共IP。使用-sname someuser@主机名-i``不起作用,因为hostname -i未扩展为真实IP。我尝试使用net_kernel:start(xxxxxxx)但它没有用。

有没有办法在使用relx的vm.args中获得动态-sname

谢谢:)

2 个答案:

答案 0 :(得分:1)

正如in the documentation所写(并在 @Soup d' Campbells 的评论中回答),-sname-name标记不需要主机名,并将自动填充节点ID的Host部分与主机的sid(短的不完全限定为-sname,FQDN为-name):

  

-sname Name使Erlang运行时系统成为分布式节点,类似于-name,但是节点名称Name @ Host的主机名部分   将是短名称,不完全合格。

     

这有时是DNS运行分布式Erlang的唯一方法   (域名系统)未运行。没有沟通   在使用-sname标志运行的节点和使用该标志运行的节点之间   -name标志,因为节点名在分布式Erlang系统中必须是唯一的。

     

-name Name使Erlang运行时系统进入分布式节点。此标志调用节点所需的所有网络服务器   分散式。见net_kernel(3)。还确保epmd继续运行   Erlang启动前的当前主机。见epmd(1)。

     

节点名称为Name @ Host,其中Host为full   当前主机的限定主机名。对于短名称,请使用   改为-sname标志。

如果您计划使用分布式节点,并且域中确实有DNS,请使用-name标志,因为它还会调用所有必需的网络服务器(如上所述)。

亲眼看看:

$> erl -sname bouly
(bouly@myserver)1>

$> erl -name bouly
(bouly@myserver.myhome.net)1>

答案 1 :(得分:0)

好像你用参数误导了net_kernel:start()。正确的论证形式是[姓名,短名]或[姓名,长号];名称是原子,应形成“localpart”或“localpart @ host”(可能你需要list_to_atom())。 例如:

2> net_kernel:start(['abc@localhost', shortnames]).
{ok,<0.39.0>}

,结果:

$ epmd -names
epmd: up and running on port 4369 with data:
name abc at port 46623