我有一个名为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").
答案 0 :(得分:0)
这是因为-s
的args标志将参数包装在列表中并将其传递给module:function/1
。 -s application start tb
将执行application:start([tb])
,这将返回{error,{bad_application,[ssl]}}
。由于这只是一个正常的返回值,erl
不会打印错误。
-s Mod [Func [Arg1,Arg2,...]](初始化标志)
使init调用指定的函数。 Func默认启动。如果没有提供参数,则假定该函数为arity 0.否则假定为arity 1,将列表[Arg1,Arg2,...]作为参数。所有参数都以原子形式传递。
有两种方法可以解决这个问题:
正如您在评论中提到的那样使用-eval "application:start(tb)"
。
将start/0
(如果尚未存在)功能添加到调用tb
的{{1}},然后仅将application:start(tb)
传递给-s tb
。只有一个参数的erl
会调用-s
。