【发布时间】:2013-08-16 21:53:55
【问题描述】:
我有一个生成唯一节点名称并开始分发的 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?
【问题讨论】:
-
您的测试运行情况如何?如果您将 erlang 进程作为节点启动,通过提供
sname或name,该进程将隐式确保 epmd 正在为您运行。 -
我正在通过
rebar eunit运行测试。 -
我明白了。总是有 erl_opts 可以添加名称,但这也有点糟糕。
-
如果 epmd 没有运行,
os:cmd("epmd -daemon")将阻塞(在 Windows 机器上测试)。如何解决这个问题?