从命令行

时间:2017-05-10 07:33:59

标签: erlang otp

我正在尝试从命令行启动一个应用程序。该应用程序基本上是一个OTP兼容的TCP服务器,它从shell启动时工作正常。但是,从命令行启动时,它实际上无法启动。

我将所有文件都放在兼容的文件夹结构中,这意味着\ src和binaries \ 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(由于将来需要args的功能,我使用了start / 2)因为从参数开始从未起作用。 现在我跑的时候:

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应用程序(为了妖魔化它),我无能为力。

感谢您的帮助。

ADDED:不确定它有用,我也添加了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。使[] []看作[[],[]]。

2 个答案:

答案 0 :(得分:1)

显然,我的问题是由于主管不能通过命令行作为标准功能启动,而是使用application:start。因此,我已经通过使用应用程序解决了我的问题,并在命令行上执行

erl (options) eval "application:start(...)"

答案 1 :(得分:0)

是的,根据http://erlang.org/doc/man/init.html,运行的功能应该是arity 1.您可以定义调用start / 2然后使用init([Application, Type])

运行的erl -run wotsuke_geolocation_lookup_server init [] []