从命令行启动 erlang 应用程序的问题
Posted
技术标签:
【中文标题】从命令行启动 erlang 应用程序的问题【英文标题】:Problems with starting an erlang application from the command line 【发布时间】:2017-10-08 17:33:02 【问题描述】:我正在尝试从命令行启动应用程序。该应用程序基本上是一个符合 OTP 的 TCP 服务器,从 shell 启动时它工作正常。但是,当从命令行启动时,它实际上并没有启动。
我将所有文件都放在一个兼容的文件夹结构中,即\src 和二进制文件\ebin 中的源文件。我已经在 .erlang 文件中设置了路径
code:add_patha("./ebin").
被调用的函数在这个模块中
-module(wotsuke_geolocation_lookup_server).
-behaviour(application).
-export([start/0, start/2, stop/1]).
start() ->
event_dbs:start(),
wotsuke_server_sup:start_link().
start(_Type, _Args) ->
event_dbs:start(),
wotsuke_server_sup:start_link().
stop(_State) ->
ok.
我还(冗余地)添加了一个 start/0(我使用 start/2,因为未来的功能需要 args),因为从参数开始从来没有用过。 现在当我跑步时:
erl -run wotsuke_geolocation_lookup_server start [] []
我明白了
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
"init terminating in do_boot",undef,[wotsuke_geolocation_lookup_server,start,[["[]","[]"]],[],init,start_it,1,[],init,start_em,1,[]]
Crash dump is being written to: erl_crash.dump...done
init terminating in do_boot ()
意味着它找不到模块/功能。因此,我使用了多余的 start/0
erl -run wotsuke_geolocation_lookup_server start
然后得到:
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1>
基本上没有启动(没有返回进程 ID)。我试图连接到服务器并在服务器关闭时得到典型的答案。我还尝试使用 -pa 选项强制 erl 进入 ebin 文件夹。同上。
这是我第一次尝试从命令行运行 erlang 应用程序(为了妖魔化它),我一无所知。
感谢您的帮助。
添加:不确定是否有帮助,我也添加了 erlang 应用程序代码
application, wotsuke_geolocation_lookup_server,
[description, "Wotsuke Geolocation lookup server",
vsn, "0.1.0",
modules, [tcpserver_otp_backend, ets_methods, data_packing, data_formats, event_timings, logger, event_dbs,
obsolete_data_clean_ad, obsolete_data_clean, wotsuke_data_input, wotsuke_logger, wotsuke_server_sup, data_retrieve, wotsuke_data_output, user_event_dbs,
event_areas],
registered, [wotsuke_data_input, wotsuke_server_sup, wotsuke_logger, wotsuke_data_output],
applications, [kernel, stdlib, mnesia],
env, [],
mod, bsc, []].
更新:解决了一个问题。命令的问题
erl -run wotsuke_geolocation_lookup_server start [] []
实际上是由于 erl 期望 start/0 仅指定模块或 arity 1 如果还指定了函数。使 [] [] 被视为 [[],[]]。
【问题讨论】:
看起来它正在选择erl -run wotsuke_geolocation_lookup_server start [] []
作为一个参数,因为 "init terminating in do_boot",undef,[wotsuke_geolocation_lookup_server,start,[["[]","[]"]],[],init,start_it,1,[],init,start_em,1,[]]
意味着 undef for start/1 因为["[]","[]"]
是一个参数
【参考方案1】:
是的,根据http://erlang.org/doc/man/init.html,run 执行的函数应该是 arity 1。您可以定义调用 start/2 的 init([Application, Type])
,然后使用 erl -run wotsuke_geolocation_lookup_server init [] []
运行
【讨论】:
确实,arity 必须是 1 零。但是,我仍然有一个问题,即当错误解决后,服务器实际上并没有启动,而形成了它的外壳。我真的不明白。【参考方案2】:很明显,我的问题是由于无法通过命令行作为标准功能启动主管,而是使用 application:start。因此,我通过使用应用程序并在命令行上执行解决了我的问题
erl (options) eval "application:start(...)"
【讨论】:
以上是关于从命令行启动 erlang 应用程序的问题的主要内容,如果未能解决你的问题,请参考以下文章
Erlang:从命令行调用 erl -eval 永远不会退出
从 bash 变量为 Erlang erl 传递 -eval 失败