запустить erlang из оболочки unix со сложными параметрами - PullRequest
3 голосов
/ 24 декабря 2010

мне нужно запустить сложную функцию модуля erlang из оболочки unix

rpc:call('node@example.com', mnesia, dirty_first, [mytable])

как мне это сделать?

UPD:

я делаю test.escript

chmod +x test.escript

#!/usr/lib64/erlang/bin/escript
%%! -name 'test@example.com'
main(_Args) ->
    R = rpc:call('node@example.com', mnesia, dirty_first, [mytable]),
    io:format("~p~n",[R]).

и получение {badrpc, nodedown}

но при запуске

erl -name test@example.com
1> rpc:call('node@example.com', mnesia, dirty_first, [mytable]).
{my, data}.

я имею в виду, что это работает, но как заставить escript работать правильно?

Ответы [ 5 ]

4 голосов
/ 24 декабря 2010

Я думаю, 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.

3 голосов
/ 24 декабря 2010

Приложение erl_call - это именно то, что вам нужно:

erl_call позволяет запускать и / или взаимодействовать с распределенным узлом Erlang.Он построен на библиотеке erl_interface в качестве примера приложения.Его целью является использование сценария оболочки Unix для взаимодействия с распределенным узлом Erlang.Он выполняет всю связь с сервером Erlang Rex, используя стандартное средство RPC Erlang.На целевом узле Erlang не требуется запуск специального программного обеспечения.

Основное назначение - либо запустить распределенный узел Erlang, либо выполнить обычный вызов функции.Тем не менее, также возможно передать модуль Erlang в erl_call и скомпилировать его, или передать последовательность выражений Erlang для оценки (аналогичную оболочке Erlang).

См. Примеры дляподробнее

1 голос
/ 24 декабря 2010

Вы можете использовать -eval флаг erl :

$ erl -eval 'io:format("Hello, World!~n")'
0 голосов
/ 22 марта 2012

Если ваша проблема заключается в том, как настроить узел Erlang в сетевом режиме (т.е. превратить узел в распределенный узел), вы можете захотеть сделать что-то вроде

EPMD = code:root_dir() ++ "/bin/epmd &",
os:cmd(EPMD),
net_kernel:start([Sname, shortnames])

, где Sname - это имя вашего желаемого узла,Только после этого вы можете начать общаться с другим узлом, например, с помощью rpc.

0 голосов
/ 24 декабря 2010

Вы можете анализировать сложные аргументы с помощью escript :

#!/usr/bin/env escript

main(String) ->
  {Node, Mod, Fun, Args} = parse_args(String),
  R = rpc:call(Node, Mod, Fun, Args),
  io:format("~p~n",[R]).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...