自習メモ〜分散プログラミング(ping/1とnodes/0)
公開されているpdfをやってみるシリーズ(?)の分散プログラミング。
マジッククッキー*1を作ったあと、net_adm:ping/1を使って疎通確認。今回はVMwarePlayer上のCentOS4.5にErlangをインストールして、Windows-CentOS間で試してみました。
まずは、Windows・CentOSそれぞれの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の引数に「'」が付いていませんが、Windows・CentOSの両方とも「'」を付けないと
(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>