我有一个 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"),
但感觉就像是黑客攻击。有没有更好/更好的方法来确保 epmd 在运行之前启动net_kernel:start
?
不,您无法确保 EPMD 以更干净的方式启动。
TL;DR
EPMD 是一个外部程序,用C实现。同时net_kernel:start/1
照顾创造net_sup导师,它实际上并不会触发 EPMD 守护进程,这一点必须明确说明。我查看了 EPMD 是如何启动的-sname
选项指定在erl
命令和 - 惊讶,惊讶 - 我发现the epmd程序是通过启动system() C call.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)