Spawn удаленный процесс без общей файловой системы - PullRequest
3 голосов
/ 22 декабря 2009
(nodeA@foo.hyd.com)8> spawn(nodeA@bar.del.com, tut, test, [hello, 5]).

Я хочу создать процесс на bar.del.com, у которого нет доступа к файловой системе на foo.hyd.com (откуда я его запускаю), запустив подпрограмму «test» модуля «tut».

Есть ли способ сделать это, не предоставив nodeA@bar.del.com скомпилированный файл модуля "tut"?

Ответы [ 3 ]

4 голосов
/ 22 декабря 2009

Вы можете использовать следующую функцию для загрузки модуля на удаленном узле без предоставления самого файла:

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 аргумент используется только для отслеживания пути к модулю, а файл, на который он указывает, не используется локальным узлом-сервером.

3 голосов
/ 22 декабря 2009

Я интерпретирую ваш вопрос как желание не копировать * .beams из вашей файловой системы в удаленную файловую систему.

Если вы просто тестируете вещи, вы можете использовать вызов nl(Mod) в оболочке erl для загрузки модуля на все (в настоящее время) известные узлы. То есть те, которые появляются в nodes().

Это отправит код и загрузит его из копии памяти, он не сохранит его в удаленной файловой системе.

Вы также можете запустить удаленный узел с помощью модуля slave. Раб получает доступ к файловой системе своего хозяина и коду сервера. Затем обычная автоматическая загрузка обеспечит наличие модуля в ведомом устройстве при вызове функции test:tut/2.

0 голосов
/ 22 декабря 2009

Вы можете отправить локальный код на удаленный узел:

> {Mod, Bin, File} = code:get_object_code(Module).
> rpc:call(RemoteNode, code, load_binary, [Mod, File, Bin]).
...