让两个 erl shell 在 OS X 上对话

Posted

技术标签:

【中文标题】让两个 erl shell 在 OS X 上对话【英文标题】:Getting two erl shells to talk on OS X 【发布时间】:2011-01-09 08:44:50 【问题描述】:

我希望能够有两个 Erlang shell 来交谈。我在 OS X 上运行。

我尝试了 tut17 示例 here。

我也试过了:

$ erl -sname foo

然后在一个新的终端中:

$ erl -sname bar

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

它在 mac 上有点坏。默认情况下,mac 无法解析自己的短名称。您的主机名很可能是“elife.local”。

如果您使用 -name FQDN 启动 erl,那么 ping 将起作用。

ie:你可以从

开始
$ 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').【参考方案2】:

一个更简单的修复可能只是编辑您的 /etc/hosts 文件并确保您有类似以下行的内容:

127.0.0.1 本地主机 elife

我的 mac 可以很好地使用短名称,我相信这就是它的原因。

【讨论】:

这是正确答案。 Erlang 将名称解析为 IP 地址,就像其他任何东西一样。作为一般原则,如果发送到同名的常规 icmp ping 未得到答复,您的 net_adm:ping 将不起作用。 除了 OSX 之外会忽略主机文件。 mac上还有一个地方可以设置,不记得在哪里了。编辑:至少它最初是这样做的,没有在雪豹下尝试过 另外,将 127.0.0.1 设置为解析为您的主机名会破坏许多 Java 应用程序(任何使用 RMI 的应用程序)。通常,您希望您的主机名指向您的“公共”IP 地址。 是的,您在 /etc/hosts 中的主机名使“-sname”可以在 Snow Leopard 上运行(我试过了)。但是对于实际尝试解析自己的主机名(即:Java RMI)的东西有缺点【参考方案3】:

对于相互通信的节点,两者应该具有相同的 cookie。在同一个盒子上,它最终使用来自 $HOME/.erlang.cookie 文件的 cookie。如果此文件不存在,它会创建一个新文件并在其中放入一些随机 cookie。未来的 shell 使用相同的 cookie。但是最好在命令行中通过 setcookie 参数指定 cookie。

erl -name node1@foo.local -setcookie mycookie

【讨论】:

最好不要通过命令行参数设置cookie,因为同系统的其他用户只要查看进程列表就可以知道你的cookie,之后恶意用户就可以发送消息了到您的 erlang 节点。如果您将 cookie 存储在文件中,请不要忘记为该文件设置适当的权限。

以上是关于让两个 erl shell 在 OS X 上对话的主要内容,如果未能解决你的问题,请参考以下文章

在活动的 OS X 桌面上保留一个窗口

如何在不中止 erl 的情况下中止 Erlang shell (erl) 中的接收语句?

ERL:从 shell 执行 erl 命令

如何使 zsh 在 Mac OS X(在 iTerm 中)上作为登录 shell 运行?

sh 用于在OS X命令行上全局链接sublime文本的Shell脚本

如何在 OS X 上获取正在读取文件的通知?