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



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

以下是代码片段:

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

来自erl文档:

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

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

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

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

  2. 向调用application:start(tb)tb添加一个start/0(如果尚未存在)函数,然后仅将-s tb传递给erl。具有单个参数的-s将调用module:start()

相关内容

  • 没有找到相关文章

最新更新