На больших и толстых системах не единичны случаи невозможности коннекта к эрланговой ноде.
Это явно указывает на то, что epmd вдруг растерял всю свою информацию.
Если в нормальном своем состоянии он показывает что-то вида
> epmd -names
epmd: up and running on port 4369 with data:
name siden at port 54406
То после "падения":
> epmd -names
epmd: up and running on port 4369 with data:
Существует общеизветсное решение в узких кругах:
допустим у нас пропала нода mynodename@mynode
- определить порт запущенной эрланговой ноды mynodename@mynode на mynode можно тем же netstat-ом (обычно это что-то между 40k и 60k)
> netstat -an | grep LIST
...
tcp4 0 0 *.54406 *.* LISTEN
...
- находим ноду из нашего эрлангового кластера, которая "знает" о пропавшей ноде и отвечает на net_adm:ping('mynodename@mynode') понгом (т.е. она уже когда-то коннектилась к пропавшей ноде и данную информацию сохранила)
- с этой найденной ноды делаем rpc:call('mynodename@mynode', erl_epmd, register_node, ['mynodename', 54406]).
И все хорошо.
Но что же делать когда нет возможности найти такую ноду.
- находим необходимый порт как в предыдущем решении
- запускаем эмулятор и выполняем следующее
> erl
Erlang R14B02 (erts-5.8.3) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.3 (abort with ^G)
1> erl_epmd:start().
{ok,<0.33.0>}
2> erl_epmd:register_node(siden, 54406).
{ok,2}
3>
- смотрим что нам говорит epmd
> epmd -names
epmd: up and running on port 4369 with data:
name siden at port 54406
- если сейчас закрыть этот эмулятор, то и информация из epmd пропадет, и все вернется на круги своя
- вместо этого мы открываем еще один эмулятор с коннектом на потерявшийся инстанс
> erl -sname siden2 -remsh 'siden@MacBook-SiDen'
Erlang R14B02 (erts-5.8.3) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.8.3 (abort with ^G)
(siden@MacBook-SiDen)1>
- epmd теперь нам говорит
epmd: up and running on port 4369 with data:
name siden2 at port 54486
name siden at port 54406
- закрываем первый эмулятор и как и следовло ожидать информация о siden в epmd исчезла
epmd: up and running on port 4369 with data:
name siden2 at port 54486
- во втором эмуляторе повторно выполняем
> erl_epmd:register_node(siden, 54406).
- статус epmd:
epmd: up and running on port 4369 with data:
name siden at port 54406
name siden2 at port 54486
- закрываем второй эмулятор
- статус epmd:
epmd: up and running on port 4369 with data:
name siden at port 54406
Ну вот собственно и все.
Конектимся к было пропавшей ноде и успешно начинаем её истязать :)