3

我有一个 eunit 测试,它生成一个唯一的节点名称并开始分发:

{A,B,C} = now(),
Nodename = list_to_atom(lists:flatten(io_lib:format(
    "test-~b-~b-~b@localhost", [A, B, C]))),
{ok, _} = net_kernel:start([Nodename, shortnames]),

只要分布式 Erlang 节点在以前的某个时间在机器上运行,因此 epmd 仍在运行,但在构建服务器上,我不能假设是这种情况。

我通过将其添加到我的测试中解决了这个问题:

_ = os:cmd("epmd -daemon"),

但感觉就像一个黑客。有没有更好/更好的方法来确保在运行之前启动 epmd net_kernel:start

4

1 回答 1

5

不,您不能确保以更清洁的方式启动 EPMD。

TL;博士

EPMD 是一个外部程序,用 C 实现。虽然net_kernel:start/1负责创建net_supsupervisor,但它实际上并没有触发 EPMD 守护进程,它必须显式启动。-sname我查看了在命令中指定选项时如何启动 EPMD erl- 惊喜,惊喜 - 我发现程序是通过C 调用启动epmdsystem()

于 2013-09-03T14:03:00.860 回答