用Erlang进行分布式计算 -- 第二篇

在前一篇文章里,我们已经看到如何连接一个远程节点并且运行Erlang里内建的模块。本文我们将学习如何可以运行我们自己的模块来做一些任务。例如我们将从远程节点获取分配给它们网络接口的ip地址。

我们的模块看起来像如下所示:

1
2
3
4
5
6
7
8
9
10
% 文件名应该是 ourmodule.erl
-module(ourmodule).
-export([ getip/0 ]).
getip()->
% 这是用于Mac终端的
% B = os:cmd('ifconfig $2 | grep \"inet \" | awk -F\' \' \'{print $2}\' | awk \'{print $1}\''),
% 这是用于Linux终端的
B = os:cmd('ifconfig $2 | grep \"inet \" | awk -F\' \' \'{print $2}\' | awk \'{print $1}\' | awk -F \':\' \'{print $2}\''),
io:format("node: ~s ~n ~s ", [node(), B]),
ok.

保存这份代码为ourmodule.erl

现在让我们来编译我们的模块。首先我们必须去到我们模块存放的目录。然后打开Erlang shell并且编译它:

1
c(ourmodule). %%% 输出是: {ok,ourmodule}

编译后,我们在同一个目录里将有一个 ourmodule.beam 文件,它是这个模块的erlang可执行文件。然后我们必须拷贝这个 ourmodule.beam 文件到远程节点。现在从相同的目录(远程节点上该文件存放的目录)让我们打开一个Erlang shell:

1
erl -name cloud@remote-host -setcookie "12345"

做完这些。这些就是我们在远程节点需要做的所有工作。

现在从你的主(也就是本地)节点执行如下命令:

1
2
3
4
5
6
7
rpc:call('cloud@remote-host', ourmodule, getip, []).
% 输出是 : 将有节点名和一些ip地址的列表
%
% node: cloud@remote-host
% 127.0.0.1
% 192.168.1.45
% ok.

这是一个简单例子,就是我们如何可以在分布式Erlang环境里运行我们自己的模块。我们可以通过增加更多函数来做其他任务,或者我们可以只是为我们的目的写新的模块,然后我们可以分布可执行文件到不同的节点并远程执行它们。

原文链接: https://medium.com/@smirazzakee/distributed-computing-using-erlang-2-c57f3242a2e0#.acwcop39g