在OS X上使两个Erlang shell进行通信

6

我希望能够实现两个Erlang shells之间的通信。我在OS X上运行。

我尝试了这里的tut17示例(链接)

我还尝试过:

$ erl -sname foo

然后在一个新的终端窗口中执行:

$ erl -sname bar

(bar@elife)1> net_adm:ping(foo@elife).
pang

有什么想法吗?
3个回答

10

在Mac上有些问题。默认情况下,Mac无法解析自己的短名称。您的主机名实际上可能是“elife.local”。

如果您使用-name FQDN选项启动erl,则ping命令将起作用。

例如:您可以使用以下命令启动:

$ erl -name foo@elife.local

通过使Mac能够解析自己的短名称,可能可以修复这个问题。

以下是我的Mac的示例输出。当我执行“-sname”时,我得到与您相同的结果。

第一个节点:

$ erl -name foo@mookie.local
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
(foo@mookie.local)1> 

另一个节点:

$ erl -name bar@mookie.local
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
(bar@mookie.local)1> net_adm:ping('foo@mookie.local').
pong

如果有人遇到这个错误,* 1:'.'之前的语法错误,请确保将名称用单引号括起来。net_adm:ping('foo@mookie.local')。 - Coderdad

4

一个更简单的解决方法可能只需要编辑你的/etc/hosts文件,并确保你有类似这样的一行:

127.0.0.1 localhost elife

我的Mac使用短名称工作得很好,我相信这就是它的原因。


2
这是正确的答案。Erlang像其他任何东西一样将名称解析为IP地址。作为一个通用原则,如果发送到相同名称的常规icmp“ping”没有回答,您的net_adm:ping将无法工作。 - Zed
除了OSX忽略hosts文件之外,在Mac上还有另一个地方可以设置它,但我记不清是在哪里了。 编辑:至少最初是这样的,在Snow Leopard下尚未尝试。 - David Budworth
另外,将127.0.0.1设置为解析主机名会破坏许多Java应用程序(任何使用RMI的应用程序)。通常,您希望主机名指向您的“公共”IP地址。 - David Budworth
是的,在Snow Leopard上将您的主机名添加到/etc/hosts中可以使“-sname”正常工作(我已经尝试过)。但这样做会有缺点,对于那些实际上尝试解析自己主机名的东西(例如:Java RMI)。 - David Budworth

0

对于节点之间的通信,它们都应该有相同的cookie。在同一台计算机上,它会使用$HOME/.erlang.cookie文件中的cookie。如果该文件不存在,则会创建一个新文件并放入一些随机cookie。未来的shell会使用相同的cookie。但最好通过setcookie参数在命令行上指定cookie。

erl -name node1@foo.local -setcookie mycookie


1
不建议通过命令行参数设置cookie,因为同一系统上的其他用户可以通过查看进程列表来获取您的cookie,此后恶意用户将能够向您的erlang节点发送消息。如果您将cookie存储在文件中,请不要忘记设置该文件的适当权限。 - taro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接