自習メモ〜分散プログラミング(リモートノードへのモジュールロード)
公開されているpdfをやってみるシリーズ(?)の分散プログラミング。
「とあるノードにあるモジュールをリモートノードへロードする」を確認しました。環境は前のエントリの通り、WindowsXP-CentOSの組み合わせです。
まずはそれぞれの分散ノードを起動し、net_adm:ping/1による疎通確認。手順は省略(^^;
続いて片側にしかないモジュールのバイナリコードをcode:get_object_code/1で読み込み。
(shimooka@win.xxx.yyy)3> {Module, Binary, Filename} = code:get_object_code(sample). {sample,<<70,79,82,49,0,0,1,216,66,69,65,77,65,116,111,109,0,0,0,68,0,0,0,7,6, 115,97,...>>, "d:/home/shimooka/erlang/sample.beam"} (shimooka@win.xxx.yyy)4>
この時点でCentOS側にはまだモジュールはロードされてませんので、m(sample)で確認するとエラーになるはずです。
(root@centos.xxx.yyy)2> m(sample). =ERROR REPORT==== 27-May-2007::17:50:36 === Error in process <0.77.0> on node 'root@centos.xxx.yyy' with exit value: {undef,[{sample,module_info,[]},{c,m,1},{erl_eval,do_apply,5},{shell,exprs,6},{shell,eval_loop,3}]} ** exited: {undef,[{sample,module_info,[]}, {c,m,1}, {erl_eval,do_apply,5}, {shell,exprs,6}, {shell,eval_loop,3}]} ** (root@centos.xxx.yyy)3>
予定通りのエラー。ここで、rpc:call/4を使ってWindows側からCentOS側へモジュールをロードさせてみます。RPC経由でcode:load_binary/3をコールすることになるようです。
(shimooka@win.xxx.yyy)3> rpc:call('root@centos.xxx.yyy', code, load_binary, [Module, Filename, Binary]). {module,sample} (shimooka@win.xxx.yyy)4>
再度、CentOS側でm(sample)してみます。
(root@centos.xxx.yyy)4> m(sample). Module sample compiled: Date: May 27 2007, Time: 08.44 Compiler options: [] Object file: d:/home/shimooka/erlang/sample.beam Exports: hello_world/0 module_info/0 module_info/1 ok (root@centos.xxx.yyy)5> sample:hello_world(). Hello, World! ok (root@centos.xxx.yyy)6>
おお!うまくいきました。なんか気持ち悪い感じもしなくもないですが、なんかすごい :-)
しかし、code:get_object_code/1で返ってくるタプルの順番とcode:load_binary/3のリストで指定する順番が微妙に違うのが気になる。。。