erlang - Asegúrese de que epmd comenzó
eunit (1)
No, no puedes asegurarte de que EPMD se inicie de una manera más limpia.
TL; DR
EPMD es un programa externo, implementado en C. Mientras que net_kernel:start/1
se encarga de crear el supervisor net_sup
, en realidad no net_sup
el demonio EPMD, que debe iniciarse explícitamente. -sname
un vistazo a cómo se inicia EPMD cuando se especifica la opción -sname
en el comando erl
y - sorpresa, sorpresa - Descubrí que el programa epmd
se inicia a través de una llamada C del system()
.
Tengo una prueba de eunit que genera un nombre de nodo único y comienza la distribución:
{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]),
Esto funciona bien siempre y cuando se haya ejecutado un nodo de Erlang distribuido en la máquina en algún momento anterior, y así epmd todavía se está ejecutando, pero en el servidor de compilación no puedo suponer que ese sea el caso.
Resolví el problema agregando esto a mi prueba:
_ = os:cmd("epmd -daemon"),
pero se siente como un truco. ¿Hay alguna manera mejor / más agradable de garantizar que epmd se inicie antes de ejecutar net_kernel:start
?