erlang epmd kill
Problem
- When Erlang version is lower than 22, if the epmd service is killed during operation, the node cannot automatically register the epmd service
- Even if you use remsh, rpc, pipe, etc. to enter the node operation
- Cannot execute related node commands normally
- May cause data to not be persisted
- Cross-server activities cannot be started normally
Solution
A. Upgrade to erlang r24 version
- The project code supports r24
B. Add a listening process to automatically inject the epmd service
- Add a gen_server to check every 5 seconds
-spec get_epmd_port() -> integer().
get_epmd_port() ->
erlang:get(epmd_port).
-spec set_epmd_port(EpmdPort :: integer()) -> undefined | integer().
set_epmd_port(EpmdPort) ->
erlang:put(epmd_port, EpmdPort).
do_init() ->
set_epmd_port(0),
OK.
do_loop_by_5_second(_Millisecond) ->
OldEpmdPort = get_epmd_port(),
case OldEpmdPort > 0 of
true ->
maybe_register_node(OldEpmdPort);
_ ->
init_epmd_port()
end,
OK.
init_epmd_port() ->
CustomIP = mmgr_init:get_custom_ip(),
{ok, NameList} = erl_epmd:names(CustomIP),
NodeName = mmgr_init:get_node_prefix_name(),
case lists:keyfind(NodeName, 1, NameList) of
{NodeName, EpmdPort} when EpmdPort > 0 ->
set_epmd_port(EpmdPort);
_ ->
ignore
end,
OK.
maybe_register_node(OldEpmdPort) ->
CustomIP = mmgr_init:get_custom_ip(),
{ok, NameList} = erl_epmd:names(CustomIP),
NodeName = mmgr_init:get_node_prefix_name(),
case lists:keyfind(NodeName, 1, NameList) of
{NodeName, OldEpmdPort} ->
ignore;
{NodeName, NewEpmdPort} when NewEpmdPort > 0 ->
set_epmd_port(NewEpmdPort);
_ ->
case erl_epmd:register_node(NodeName, OldEpmdPort) of
{ok, Creation} ->
io:format("~s reconnect epmd at ~w succeed. Creation=~w", [NodeName, OldEpmdPort, Creation]);
Error ->
io:format("~s reconnect epmd at ~w error. Error=~w", [Error])
end
end,
ok.
Others
Some problems with epmd

Custom implementation of epmd