Использование os:cmd to в escript для запуска приложения Erlang завершается неудачно.

У меня есть приложение Erlang с именем tb, которое отлично работает из командной строки Erlang, выполнив application: start (tb). Принимая во внимание, что когда я пытаюсь вызвать то же приложение изнутри escript с помощью os: cmd, приложение, похоже, не запускается. Когда я делаю 'PS | grep beam', я вижу запущенный процесс beam.smp. Но приложение не генерирует никакого вывода. В чем может быть проблема? Есть ли лучший способ запустить другую erlang VM изнутри escript?

Вот фрагмент кода:

net_kernel:start([tb_escript, shortnames]),
read_config_file(FName),
Cookie = get(cookie),
Node = get(node),
N = io_lib:format("~p",[Node]),
lists:flatten(N),
C = io_lib:format("~p",[Cookie]),
lists:flatten(C),
EBIN = "~/tb/ebin",
erlang:set_cookie(tb_escript,Cookie), 
os:cmd("erl -pa " ++ EBIN ++ " -sname " ++ N ++ " -detached " ++ " -setcookie " ++ C ++ " -s application start tb").

1 ответ

Решение

Это происходит потому, что флаг args -s оборачивает аргументы в список и передает их module:function/1, -s application start tb выполнит application:start([tb]), который бы вернулся {error,{bad_application,[ssl]}}, Поскольку это просто нормальное возвращаемое значение, ошибка не выводится erl,

От erl документация:

-s Mod [Func [Arg1, Arg2, ...]] (флаг инициализации)

Заставляет init вызывать указанную функцию. По умолчанию Func запускается. Если аргументы не предоставлены, предполагается, что функция имеет арность 0. В противном случае предполагается, что она имеет арность 1, принимая список [Arg1, Arg2, ...] в качестве аргумента. Все аргументы передаются как атомы.

Есть два способа решить это:

  1. использование -eval "application:start(tb)", как вы уже упоминали в комментарии.

  2. Добавить start/0 (если еще не присутствует) функция для tb какие звонки application:start(tb), а затем просто пройти -s tb в erl, -s с одним аргументом позвоню module:start(),

Другие вопросы по тегам