Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

自習メモ〜分散プログラミング(ping/1とnodes/0)

公開されているpdfをやってみるシリーズ(?)の分散プログラミング。
マジッククッキー*1を作ったあと、net_adm:ping/1を使って疎通確認。今回はVMwarePlayer上のCentOS4.5にErlangをインストールして、Windows-CentOS間で試してみました。
まずは、WindowsCentOSそれぞれのhostsファイルにテスト用FQDNを追加。Windows側には2つ用意してみました。

192.168.52.1    win.xxx.yyy test.xxx.yyy
192.168.52.128  centos.xxx.yyy

ノード名(任意の名前@ホスト名)を指定して分散ノードを起動。まずはWindows側。

D:\home\shimooka\erlang>erl -name shimooka@win.xxx.yyy
Eshell V5.5.4  (abort with ^G)
(shimooka@win.xxx.yyy)1>

次にCentOS側を起動し、net_adm:ping/1を実行。「pong」と返ってくれば成功です。

[root@centos ~]# erl -name root@centos.xxx.yyy
Erlang (BEAM) emulator version 5.5.4 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.5.4  (abort with ^G)
(root@centos.xxx.yyy)1> net_adm:ping('shimooka@win.xxx.yyy').
pong
(root@centos.xxx.yyy)2> 

今度はWindows側からCentOSへのnet_adm:ping/1。

(shimooka@win.xxx.yyy)1> net_adm:ping('root@centos.xxx.yyy').
pong
(shimooka@win.xxx.yyy)2>

うまくいったようです :-)
続いて、片方を終了させたあとに

(shimooka@win.xxx.yyy)2> q().
D:\home\shimooka\erlang>

再度pingをすると接続失敗「pang」が返ってきます。

(root@centos.xxx.yyy)3> net_adm:ping('shimooka@win.xxx.yyy').
pang
(root@centos.xxx.yyy)4>

また、分散ノード名で識別されるようなので、test.xxx.yyyでのnet_adm:ping/1はpangになりました。

(root@centos.xxx.yyy)4> net_adm:ping('shimooka@win.xxx.yyy').
pong
(root@centos.xxx.yyy)5> net_adm:ping('shimooka@test.xxx.yyy').
pang
(root@centos.xxx.yyy)6>

最後に、nodes/0で繋がっているノードを確認してみました。net_adm:ping/1をしたあとじゃないと空のリストが返ってきます。

(root@centos.xxx.yyy)6> q().
ok
(root@centos.xxx.yyy)7> [root@centos ~]#
[root@centos ~]# erl -name root@centos.xxx.yyy
Erlang (BEAM) emulator version 5.5.4 [source] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.5.4  (abort with ^G)
(root@centos.xxx.yyy)1> nodes().
[]
(root@centos.xxx.yyy)2> net_adm:ping('shimooka@win.xxx.yyy').
pong
(root@centos.xxx.yyy)3> nodes().
['shimooka@win.xxx.yyy']
(root@centos.xxx.yyy)4>

ちなみに、公開されているpdfではnet_adm:ping/1の引数に「'」が付いていませんが、WindowsCentOSの両方とも「'」を付けないと

(root@centos.xxx.yyy)5> net_adm:ping(shimooka@win.xxx.yyy).

=ERROR REPORT==== 25-May-2007::23:57:08 ===
Error in process <0.37.0> on node 'root@centos.xxx.yyy' with exit value: {badarith,[{erl_eval,eval_op,3},{erl_eval,expr_list,6},{erl_eval,expr,5},{shell,exprs,6},{shell,eval_loop,3}]}

** exited: {badarith,[{erl_eval,eval_op,3},
                      {erl_eval,expr_list,6},
                      {erl_eval,expr,5},
                      {shell,exprs,6},
                      {shell,eval_loop,3}]} **
(root@centos.xxx.yyy)6>

となりました。実はこれでずっとはまってました。。。orz
あと、FQDNでない場合、以下のようなエラーになります。

(root@centos.xxx.yyy)6> net_adm:ping('shimooka@win').
=ERROR REPORT==== 25-May-2007::23:59:26 ===
** System running to use fully qualified hostnames **
** Hostname win is illegal **
pang
(root@centos.xxx.yyy)7>

*1:前のエントリには誤りがありますので注意