从命令行启动 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:创建磁盘模式

Erlang:从命令行调用 erl -eval 永远不会退出

从 bash 变量为 Erlang erl 传递 -eval 失败

Erlang 命令行

如何在 Erlang shell 中运行 Erlang 应用程序

如何调试无法启动的erlang应用程序