我有一个 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?
不,您无法确保以更简洁的方式启动 EPMD。
TL; 博士
EPMD 是一个外部程序,用 C 实现。虽然net_kernel:start/1负责创建net_supsupervisor,但它实际上并没有触发 EPMD 守护进程,它必须显式启动。我查看了在命令中-sname指定选项时如何启动 EPMDerl并且 - 惊奇,惊奇 - 我发现该epmd程序是通过system()C 调用启动的。
| 归档时间: |
|
| 查看次数: |
2297 次 |
| 最近记录: |