Использование 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, ...] в качестве аргумента. Все аргументы передаются как атомы.
Есть два способа решить это:
использование
-eval "application:start(tb)"
, как вы уже упоминали в комментарии.Добавить
start/0
(если еще не присутствует) функция дляtb
какие звонкиapplication:start(tb)
, а затем просто пройти-s tb
вerl
,-s
с одним аргументом позвонюmodule:start()
,