4

我正在使用 relx 构建我的版本,但我不能使用默认值-sname someuser@127.0.0.1。相反,我想做一些类似 -sname someuser@`hostname -i` 的事情来在启动时定义节点的公共 IP。使用-sname someuser@主机名 -i`` 不起作用,因为hostname -i未扩展为真实 IP。我尝试使用 net_kernel:start(xxxxxxx) 但它不起作用。

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

谢谢 :)

4

2 回答 2

1

正如文档中所写(并在@Soup d'Campbells的评论中回答),-snameand-name标志不需要主机名,并且会自动用主机Host的 sid 填充节点 ID 的部分(简称不完全限定 - sname,-name 的 FQDN):

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

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

-name Name 使 Erlang 运行时系统成为一个分布式节点。此标志调用节点变为分布式所需的所有网络服务器。参见 net_kernel(3)。还确保在 Erlang 启动之前 epmd 在当前主机上运行。请参阅 epmd(1)。

节点的名称将为 Name@Host,其中 Host 是当前主机的标准主机名。对于短名称,请改用 -sname 标志。

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

你自己看:

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

$> erl -name bouly
(bouly@myserver.myhome.net)1>
于 2014-07-24T08:35:44.703 回答
0

似乎您对net_kernel:start()参数有误。参数的正确形式是 [Name, shortnames] 或 [Name, longnames];名称是原子,应形成为“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
于 2014-07-24T10:23:04.007 回答