【问题标题】:Ensure epmd started确保 epmd 已启动
【发布时间】: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 进程作为节点启动,通过提供 snamename,该进程将隐式确保 epmd 正在为您运行。
  • 我正在通过rebar eunit 运行测试。
  • 我明白了。总是有 erl_opts 可以添加名称,但这也有点糟糕。
  • 如果 epmd 没有运行,os:cmd("epmd -daemon") 将阻塞(在 Windows 机器上测试)。如何解决这个问题?

标签: erlang eunit


【解决方案1】:

不,您不能确保以更清洁的方式启动 EPMD。

TL;DR

EPMD 是一个外部程序,implemented in C。虽然net_kernel:start/1 负责creating the net_sup supervisor,但它实际上并没有触发必须显式启动的EPMD 守护程序。我查看了在 erl 命令中指定 -sname 选项时如何启动 EPMD 并且 - 惊喜,惊喜 - 我发现 the epmd program is started via a system() C call

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多