我希望能够实现两个Erlang shells之间的通信。我在OS X上运行。
我尝试了这里的tut17示例(链接)。
我还尝试过:
$ erl -sname foo
然后在一个新的终端窗口中执行:
$ erl -sname bar
(bar@elife)1> net_adm:ping(foo@elife).
pang
有什么想法吗?
在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
一个更简单的解决方法可能只需要编辑你的/etc/hosts文件,并确保你有类似这样的一行:
127.0.0.1 localhost elife
我的Mac使用短名称工作得很好,我相信这就是它的原因。
net_adm:ping
将无法工作。 - Zed对于节点之间的通信,它们都应该有相同的cookie。在同一台计算机上,它会使用$HOME/.erlang.cookie文件中的cookie。如果该文件不存在,则会创建一个新文件并放入一些随机cookie。未来的shell会使用相同的cookie。但最好通过setcookie参数在命令行上指定cookie。
erl -name node1@foo.local -setcookie mycookie