Я думаю, escript может быть чем-то стоящим.
Редактировать: некоторые примеры.
Сначала для всех примеров: как-нибудь запустить удаленный узел где-нибудь.
dannib@duval:~:> erl -sname bar
(bar@duval)1> erlang:get_cookie().
'KNKKCFPYMJUPIOLYPOAA'
Escript
1: Создайте файл с именем hello.escript
с содержимым
#!/usr/bin/env escript
%%! -sname foo@duval -setcookie KNKKCFPYMJUPIOLYPOAA
main(_String) ->
Node = 'bar@duval',
Mod = 'erlang',
Fun = 'node',
Args = [],
R = rpc:call(Node, Mod, Fun, Args),
io:format("Hello there ~p~n",[R]).
Обратите внимание, что %%! -sname foo@bar
идентифицируетузел на хосте (вместо создания nonode @ nohost), разрешите установить тот же файл cookie %%! -sname foo@duvel -setcookie KNKKCFPYMJUPIOLYPOAA
, что и на целевом хосте, что решает проблему получения {badrpc,nodedown}
.Обратите внимание, что то же самое утверждение справедливо для следующих примеров (erl_call и -eval), где заданы как имя узла, так и cookie.
2: установить бит выполнения и запустить
$ chmod +x hello.escript
$ ./hello.escript
Hello there bar@duval
Erl_call
1: запустить
$ erl_call -c 'KNKKCFPYMJUPIOLYPOAA' -a 'erlang node' -n bar@duval
bar@duval
Eval
1: run
$ erl -sname foo -setcookie 'KNKKCFPYMJUPIOLYPOAA'
-eval 'io:format("Hello there ~p~n",[rpc:call(bar@duval,erlang, node, [])])'
... Eshell V5.7.4 (abort with ^G)
(foo@duval)1> Hello there bar@duval
Это создает оболочку, которая может быть не такой, как вы хотите в этом случае.
Я мог бы упомянуть, что если оба узла находятся на одном и том же хосте и используют одно и то же значение cookie по умолчанию, то значение cookie для foo и bar не нужно явно устанавливать, как в примерах.
После выполнения этих примеров и повторного прочтения вашего вопроса, я думаю, что то, что я дал ДАЖЕМУ СОВЕТУ, будет вашим лучшим выбором, erl_call.Я выбрал слово «сложный» в названии вопроса, где имхо-сценарии позволяют легко и просто читать более «сложные» настройки.Переменная _String
в примере escript содержит аргументы скрипта, который позволяет как получить доступ к вводу через оболочку, так и выполнить сложные операции erlang в EVM.Но erl_call может быть более простым, если у вас уже есть логика в каком-то другом приложении, и вам просто нужно сделать этот простой вызов узла erlang.