我有一个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?

最佳答案

不,您不能确保以更干净的方式启动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

07-24 09:55