Interconnecting Erlang Nodes

2009-03-09

警告:Erlang节点一旦相互连接就可以对对方进行完全的控制,包括在对方上运行任何命令,甚至可以完全关闭对方节点~~

Cookie

首先应将各个节点上的Cookie设置成一样,设置Cookie有如下方式:

在Erlang节点启动时添加如下参数:
erl -setcookie THISISJUSTATEST -name node1

或者可以将cookie存储在$HOME/.erlang.cookie文件里:
THISISJUSTATEST

又或者当你用参数-name或-sname启动Erlang节点之后,可以执行如下函数:
erlang:set_cookie(node(), ‘ THISISJUSTATEST ‘).

要检查各个节点上的Cookie是否都一样,可调用如下函数:
erlang:get_cookie().

Nodes names

当启动Erlang节点的时候,务必要设置一个唯一的节点名:
erl -name nodename

节点启动后,可用如下函数来检视当前节点名:
node().
‘ nodename@machine1.example.org ‘

Hosts file

在$HOME目录(或者code:root_dir()目录)创建文件.hosts.erlang,其内容为其他节点所在的主机名,例如在machine1里其内容如下:
‘ machine2.example.com ‘.

执行如下函数检查其是否被正确的加载:
net_adm:host_file().

Interconnect the Erlang nodes

首先当然系启动所有节点啦,然后在node1上执行如下函数:
net_adm:world().
[' node2@machine2.example.com ',' node1@machine1.example.com']
可以看到node1已经发现了在machine2上的令一个节点node2~~

执行如下函数看看自己都连接到什么节点上了:
nodes().
[' node2@machine2.example.com ']
已经连接到node2上了~~

当然啦你也可以手动尝试连接到其他节点,如果连接成功会返回pong,失败则返回pang:
net_adm:ping(’ node2@machine2.example.com ‘).
pong
net_adm:ping(’ node3@notexist.com ‘).
pang

最后搞个比较有趣的东东,调用如下函数可以收集所有其他节点上的时间:
rpc:multical(nodes(), erlang, localtime, []).

上面的这个函数定义如下:
rpc:multical(Nodes, Module, Function, Args) -> {ResL, BadNodes}

Nodes = [node()]
Module = Function = atom()
Args = [term()]
ResL = [term()]
BadNodes = [node()]

Start an erlang shell on a remote node

连接到其他节点上之后,你还可以在远程节点上运行Erlang shell,例如在node1的shell上按Ctrl+G可以进入到任务控制模式(jobs control mode):
User switch command
–>

输入h可以获得帮助:
User switch command
–> h
c [nn] - connect to job
i [nn] - interrupt job
….

输入j以查看当前任务:
–> j
1* {shell, start, []}
–>

我们可以在node2上创建一个远程任务:
–> r ‘ node2@machine2.example.com ‘
–> j
1 {shell, start, []}
2* {node2@machine2.example.com, shell, start, []}
–>

连接到新的任务:
–> c 2
Eshell V5.4 (abort with ^G)
(node2@machine2.example.com) 1>

Play with your remote Erlang shell

提醒一下:连接到远程节点上之后,你可以对其进行任何操作,就像你操作本地节点一样~~

例如我可以获取远程节点的内存状况:
memory()
.
[{total, 3010399}, ....]

或者可以获取远程节点当前有多少进程在运行:
erlang:system_info(process_count).

….

Close the remote Erlang shell safely

搞掂之后记得要关闭远程Erlang shell,再次按Ctrl+G,然后输入j查看远程shell的ID:
User switch command
–> j
1 {shell, start, []}
2* {node2@machine2.example.com, shell, start, []}
–>

远程shell的ID系2,然后输入如下命令来关掉它:
–> k 2
–>

不过没有任何关闭成功或失败的信息,所以再查看一下所有任务确认远程shell已经关闭:
–> j
1 {shell, start, []}
–>

最后还有一个更加便捷的方式来连接到远程节点并启动一个远程shell:
erl -sname node1 -remsh node2@machine2.example.com
Erlang (BEAM) emulator version 5.4.8 [source] [hipe]
Eshell V5.4.8 (abort with ^G)
(node2@machine2.example.com)1>

(译自Ejabber Tutorials)

M-OSCAR | Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com