确保 epmd 已启动

leg*_*cia 3 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]),
Run Code Online (Sandbox Code Playgroud)

只要分布式 Erlang 节点之前在机器上运行过,因此 epmd 仍在运行,这就可以正常工作,但在构建服务器上,我不能假设是这种情况。

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

_ = os:cmd("epmd -daemon"),
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*loi 5

不,您无法确保以更简洁的方式启动 EPMD。

TL; 博士

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