【发布时间】: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 因为["[]","[]"]是一个参数
标签: erlang erlang-otp