0

我有一个名为 tb 的 Erlang 应用程序,它通过执行 application:start(tb) 从 Erlang 命令行运行良好。而当我尝试使用 os:cmd 从 escript 内部调用相同的应用程序时,该应用程序似乎没有运行。当我做一个'ps | grep beam',我看到 beam.smp 进程正在运行。但是应用程序没有生成任何输出。可能是什么问题?有没有更好的方法从 escript 内部启动另一个 erlang VM?

这是代码片段:

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").
4

1 回答 1

0

发生这种情况是因为 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 tberl. -s使用单个参数将调用module:start().

于 2016-07-27T20:03:16.720 回答