2014-10-08 3 views
1

У меня есть удаленный узел Erlang и локальный компьютер разработчика. Я хочу запустить локальный узел [email protected], запустить наблюдателя, вызвать c:nl/1 и другие действия отладки. Я написал это:Запуск Erlang Observer с пересылкой порта ssh

#!/bin/sh 
    export ERL_EPMD_PORT=43690 
    PORT=`ssh -l user target -p 5022 "/usr/bin/epmd -names" | awk '$2 == "target-node" {print $5}'` 
    pkill -f ssh.*-fxN.*target 
    ssh -fxNL 43690:`hostname`:4369 target -p 5022 -l user 
    ssh -fxNL $PORT:`hostname`:$PORT target -p 5022 -l user 
    ssh -fxNR 9001:`hostname`:9001 target -p 5022 -l user 
    erl -name [email protected] -setcookie ABCDEFFJKGSK \ 
    -kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001 \ 
    -eval "net_adm:ping('[email protected]')." 
    pkill -f ssh.*-fxN.*target 

Но когда я запускаю этот сценарий, я получаю сообщение, как:

связывают: Адрес уже используется Bad местной спецификации переадресации ': Debian:' Erlang/OTP 17 [ГЭР -6.1] [источник] [64-бит] [smp: 4: 4] [async-threads: 10] [kernel-poll: false]

Eshell V6.1 (отменить с помощью^G) (dev @ 127.0.0.1) 1>

Как я могу запустить наблюдателя на локальной машине и подключить их к удаленному узлу?

ответ

3

Есть по крайней мере три вещи:

  • не закрывая соединения TCP правильно
  • имена узлов
  • туннелирование неправильно

Если закрыть процесс, который держит соединение TCP с kill его может перейти на TIME_WAIT состояние в течение нескольких минут: read more

В ssh -L port:host:hostport, у вас есть 2 компонент:

  • первого один является port и это говорит о том, использовать этот порт на моей местных машины
  • host:hostport означает: «подключиться к этому узлу и порту с удаленного машина», вы можете себе представить, что вы уже на удаленном компьютере, и вы хотите подключиться к третьему

вы используете hostname внутри, который оценивается на вашей локальной машине и возвращает debian, и это не имеет смысла, потому что, вероятно, debian ничего не значит на вашей удаленной машине. Попытайтесь использовать:

ssh -fxNR 9001:localhost:9001 target -p 5022 -l user 

Это должно работать как ожидалось без ошибки о спецификации.

Эрланг распределяет имена узлов для поиска машин. На своем локальном узле вы звоните:

net_adm:ping('[email protected]'). 

, который пытается связаться с портом 4369 непосредственно на цели без переадресации портов.

Распределенный Erlang был разработан для использования в локальных надежных сетях. Это действительно сложно настроить с помощью переадресации портов. Вы можете запустить узел отладки на удаленном компьютере и подключиться к вашей системе - это должно быть легко. Если удаленная система имеет X-сервер, вы можете даже переслать окно наблюдателя (ssh -Y).

1

Я пытался автоматизировать тот же SSH переадресации портов подход и пришел к этому проекту: https://github.com/virtan/ccl

Добавить sys.config с {ccl, [ {slaves, [ {"ef1", "ef1.somehost.net", use} ]} ]} и начать CCL приложения, чтобы получить туннель ef1.somehost.net установленный и удаленный узел запущен и подключен.

1

Сначала найдите удаленный порт:

$ ssh remote-host "epmd -names" 
    epmd: up and running on port 4369 with data: 
    name some_node at port 58769 

Отметьте на порту для себя и порта узла вы заинтересованы в отладке EPMD. Повторное подключение к удаленному хосту с этими портами пересылаемой:

$ ssh -L 4369:localhost:4369 -L 58769:localhost:58769 remote-host 

На вашей машине запустить скрытый узел Erlang запуска приложения наблюдателя:

$ erl -name [email protected] -setcookie if-server-has-one -hidden -run observer 

NB: Если сервер использует -sname, что вам нужно также использовать -sname, потому что Erlang ™. По той же причине вам также потребуется изменить имя хоста вашей системы, чтобы он соответствовал целевому узлу.

В наблюдателе перейдите к Узлы - Подключите узел и введите [email protected].

Вы также можете получить удаленный шелл:

$ erl -name [email protected] -setcookie if-server-has-one -remsh [email protected] 
0

@ ответ tkowal в лучше объясняет проблему здесь, но я хочу поделиться тем, как я справиться с этой проблемой. Мне часто нравится пересылать порты, перечисленные epmd -names, на localhost, поэтому я могу легко использовать свои локальные инструменты графического интерфейса для проверки состояния вещей на удаленных узлах. Я написал shell script automatically forward the ports for me, поэтому мне не нужно запоминать кучу команд. Это простой в использовании:

$ ./epmd_port_forwarder --server=remote-erlang-server.net 
epmd: Cannot connect to local epmd 
Killed local epmd 
epmd: up and running on port 4369 with data: 
name remote_erlang_node at port 46259 
Forwarding ports 
+ ssh -N -L 4369:localhost:4369 -L 46259:localhost:46259 remote-erlang-server.net 

После запуска скрипта, то вы можете использовать epmd -names в список удаленных узлов, которые пересылаются.

Смежные вопросы