我有一个名为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,…]作为参数。所有参数都以原子形式传递。
有两种方法可以解决这个问题:
使用
-eval "application:start(tb)"
,正如您在评论中提到的那样。向调用
application:start(tb)
的tb
添加一个start/0
(如果尚未存在)函数,然后仅将-s tb
传递给erl
。具有单个参数的-s
将调用module:start()
。