确保epmd开始

时间:2013-08-14 19:13:36

标签: erlang eunit

我有一个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"),

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

1 个答案:

答案 0 :(得分:4)

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

<强> TL; DR

EPMD是一个外部程序implemented in C。虽然net_kernel:start/1处理creating the net_sup supervisor,但它实际上并不触发EPMD守护程序,该守护程序必须明确启动。我在-sname命令中指定了erl选项时看了EPMD是如何启动的 - 惊讶的是,我发现the epmd program is started via a system() C call