2015-08-22 4 views
5

У меня очень простой пример кода Эликсира Я хочу работать на разных узлах.Пример распределенного эликсира не работает

Первый узел находится на моем ноутбуке, второй - малиновый Pi, доступ через SSH.

Код прост:

# [email protected] 
defmodule Hello do 
    def world, do: IO.puts "hello world" 
end 

# [email protected] 
iex> Node.spawn_link :"[email protected]", fn -> Hello.world end 

Я ожидал, что Node.spawn_link напечатает "hello world" на Raspberry Pi, но вместо этого он показывает ошибку говоря ** (EXIT from #PID<0.66.0>) no connect

На той же машине с двумя различными iex экземплярами этого код работает просто отлично.

Я начинаю сессию IEx по телефону node1 с iex --sname node1 --cookie secret и по телефону node2 с номером iex --sname node2 --cookie secret.

Стоит также отметить, что на моем Raspberry Pi iex начинается с этим предупреждением:

warning: the VM is running with native name encoding of latin1 which may cause Elixir to malfunction as it expects utf8. Please ensure your locale is set to UTF-8 (which can be verified by running "locale" in your shell) Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)

+2

Если вы звоните 'узла @ raspberry' с вашего компьютера (или вице- versa), вам нужно убедиться, что вы указали где-то, что малина-хозяин указывает на малиновый IP-адрес, иначе среда выполнения не знает, как найти «малину». Возможно, более простой способ - использовать IP-адреса: 'Node.spawn_link:" [email protected] ", ...'. Также используйте другие функции в узле, чтобы найти больше информации о том, что связано, а что нет. –

+0

Я изменил '/ etc/hosts', чтобы указать« raspberrypi »на локальный IP-адрес малины (' 192.168.1.103'). Эликсир жаловался, что '[ошибка] ** Система работает, чтобы использовать полностью зарегистрированные имена хостов ** ** Имя хоста raspberrypi является незаконным **' Итак, я пошел и изменил имена на IP: 'Node.spawn_link:" [email protected] .1.103 ", fn -> Hello.world end', и он сказал мне, что' ** Невозможно запустить: erlang :: apply, [# Function <20.54118792/0 in: erl_eval.expr/5>, []] ([ : link]) on: "[email protected]" ** ' Уверен, что мне не хватает чего-то действительно простого здесь. – thepanuto

+0

ОК, я понял. Это была вещь IP все время, я просто ввернул вещи. Спасибо, Хосе! – thepanuto

ответ

5

Я думаю, вам нужно поставить @ знак в узле-именах, чтобы заставить их быть истолкована как отдельные сетевые машины

iex --name [email protected] --cookie mycookie 
iex --name [email protected] --cookie mycookie 

, а затем в первой IEX оболочки подключить узлы:

Node.connect :"[email protected]" 

Обратите внимание на синтаксис двоеточия, который делает имя узла в атоме эликсира. Котировки нужны из-за знака @. Вы можете попробовать machinenames с необработанным IP-адреса, прежде чем пытаться имена DNS, если возникают проблемы с Nb: Я использую --name, а не на --sname

+0

'Node.connect:" node @ machinename2 "' возвращает красивый 'false'. Пробовал и с IP. Я где-то читал, что есть файл Erlang, который имеет соединение с куки-файлами. – thepanuto

+0

Это сработало, на самом деле! Большое спасибо. – thepanuto

+0

Что изменилось между вашими комментариями? –

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