在escript中使用os:cmd启动Erlang应用程序失败。

时间:2016-07-26 17:39:13

标签: erlang escript

我有一个名为tb的Erlang应用程序,可以通过执行应用程序来启动Erlang命令行:start(tb)。而当我尝试使用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").

1 个答案:

答案 0 :(得分:0)

这是因为-s的args标志将参数包装在列表中并将其传递给module:function/1-s application start tb将执行application:start([tb]),这将返回{error,{bad_application,[ssl]}}。由于这只是一个正常的返回值,erl不会打印错误。

来自erl documentation

  

-s Mod [Func [Arg1,Arg2,...]](初始化标志)

     

使init调用指定的函数。 Func默认启动。如果没有提供参数,则假定该函数为arity 0.否则假定为arity 1,将列表[Arg1,Arg2,...]作为参数。所有参数都以原子形式传递。

有两种方法可以解决这个问题:

  1. 正如您在评论中提到的那样使用-eval "application:start(tb)"

  2. start/0(如果尚未存在)功能添加到调用tb的{​​{1}},然后仅将application:start(tb)传递给-s tb。只有一个参数的erl会调用-s