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