我正在尝试从命令行启动一个应用程序。该应用程序基本上是一个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。使[] []看作[[],[]]。
答案 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 [] []