2015-08-22 26 views
5

我有一个非常简单的Elixir代码示例,我想在不同的节点上运行。分布式Elixir示例不起作用

第一个节点在我的笔记本电脑上,第二个节点是Raspberry 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",而是它显示了两种不同的iex情况下,这种错误说** (EXIT from #PID<0.66.0>) no connect

在同一台机器代码工作得很好。

我开始在node1iex --sname node1 --cookie secretnode2iex --sname node2 --cookie secret的IEx会话。

另外值得一提的是,在我的树莓派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'(或副相反),你需要确保你已经声明主机树莓指向树莓IP,否则运行时不知道如何找到“树莓”。现在可能更简单的方法是使用IP:'Node.spawn_link:“[email protected]”,...'。还可以使用Node中的其他功能来查找有关已连接和未连接的更多信息。 –

+0

我改变了'/ etc/hosts'指向'raspberrypi'到树莓的本地IP地址('192.168.1.103')。 Elixir抱怨说,[错误] **系统运行使用完全合格的主机名** **主机名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

好的,我明白了。这一直是知识产权问题,我只是搞砸了。谢谢,何塞! – thepanuto

回答

5

我认为你需要把在节点名称@标志,让他们被认为是不同的联网的计算机

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

,然后在第一IEX壳连接节点:

Node.connect :"[email protected]" 

请注意使节点名称变成elixir原子的冒号语法。由于@符号,引号是必需的。 你可以尝试用原始IP地址machinenames首先尝试DNS名称之前,如果您有问题 注:我用--name而不是你--sname

+0

'Node.connect:“node @ machinename2”'返回一个漂亮的'false'。也尝试过IP。 我在某处读到Erlang使用的文件,它与Cookie有连接。 – thepanuto

+0

它的工作,实际上!非常感谢。 – thepanuto

+0

你的评论发生了什么变化? –