(nodeA@foo.hyd.com)8> spawn(nodeA@bar.del.com, tut, test, [hello, 5]).
我想在 bar.del.com 上生成一个进程,该进程没有对 foo.hyd.com 的文件系统访问权限(从我生成进程的位置),运行模块“tut”的子例程“test”。
有没有办法这样做,不向 nodeA@bar.del.com 提供已编译的“tut”模块文件?
(nodeA@foo.hyd.com)8> spawn(nodeA@bar.del.com, tut, test, [hello, 5]).
我想在 bar.del.com 上生成一个进程,该进程没有对 foo.hyd.com 的文件系统访问权限(从我生成进程的位置),运行模块“tut”的子例程“test”。
有没有办法这样做,不向 nodeA@bar.del.com 提供已编译的“tut”模块文件?
您可以使用以下函数在远程节点加载模块,而无需提供文件本身:
load_module(Node, Module) ->
{_Module, Bin, Filename} = code:get_object_code(Module),
rpc:call(Node, code, load_binary, [Module, Filename, Bin]).
如code:load_binary/3
Filename
参数中所述,仅用于跟踪模块的路径,并且它指向的文件不被本地 node_server 使用。
我将您的问题解释为不希望将 *.beams 从您的文件系统复制到远程文件系统。
如果您只是在测试东西,您可以使用nl(Mod)
erl shell 中的调用在所有(当前)已知节点上加载模块。也就是说,那些出现在nodes()
.
这将发送代码并从内存副本中加载它,它不会将其存储在远程文件系统中。
您还可以使用该slave
模块启动远程节点。从站访问其主站的文件系统和代码服务器。test:tut/2
然后,当您调用函数时,普通的自动加载将确保模块存在于从站中。
您可以将本地代码发送到远程节点:
> {Mod, Bin, File} = code:get_object_code(Module).
> rpc:call(RemoteNode, code, load_binary, [Mod, File, Bin]).