无法在Erlang中运行简单的应用程序

时间:2012-01-18 12:51:48

标签: erlang

我在Erlang中编写了一个简单的应用程序,但它拒绝使用以下错误:

   =SUPERVISOR REPORT==== 18-Jan-2012::15:03:27 ===
 Supervisor: {<0.60.0>,my_sup}
 Context:    start_error
 Reason:     {'EXIT',{undef,[{my,start,[{8077,none}]},
                             {supervisor,do_start_child,2},
                             {supervisor,start_children,3},
                             {supervisor,init_children,2},
                             {gen_server,init_it,6},
                             {proc_lib,init_p_do_apply,3}]}}
 Offender:   [{pid,undefined},
              {name,my},
              {mfa,{my,start,[{8077,none}]}},
              {restart_type,permanent},
              {shutdown,brutal_kill},
              {child_type,worker}]

=INFO REPORT==== 18-Jan-2012::15:03:27 ===
application: my
exited: {shutdown,{my_app,start,[normal,[noarg]]}}
type: temporary {error,{shutdown,{my_app,start,[normal,[noarg]]}}}

模块:

my.erl

-module(my).
-export([start/2, stop/0]).

start(Port,_arg) ->
 io:format("starting my").

stop() ->
  ok.

my_app.erl应用程序模块,执行application行为。

 -module(my_app).
 -behaviour(application).
 -export([start/2, stop/1]).

  start(_Type, _Args) ->
   io:format("my server starting~n"),
   my_sup:start_link().

  stop(_State) ->
   io:format("my server terminating~n"),
   ok.

my_sup.erl主管逻辑

-module(my_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).

start_link() ->
  supervisor:start_link(my_sup, []).

init(_Args) ->
 {ok, {
       {one_for_one, 10, 60},
          [{my, {my, start, [{8077,none}]
       },
        permanent, brutal_kill, worker, [my]}]}}.

配置文件(my.app):

 {application, my,
 [
  {description, "Demo"},
  {vsn, "1.0"},
  {id, "hello"},
  {modules,      [my,my_sup]},
  {registered,   [my,my_sup]},
  {applications, [kernel, stdlib]},
  %%
  %% mod: Specify the module name to start the application, plus args
  %%
  {mod, {my_app, [noarg]}},
  {env, []}
  ]
 }.

我改变了你推荐的儿童规格,但问题仍然存在。

 =SUPERVISOR REPORT==== 19-Jan-2012::00:34:21 ===
 Supervisor: {<0.96.0>,my_sup}
 Context:    start_error
 Reason:     <0.97.0>
 Offender:   [{pid,undefined},
          {name,my},
          {mfa,{my,start,[8077,none]}},
          {restart_type,permanent},
          {shutdown,brutal_kill},
          {child_type,worker}]


=ERROR REPORT==== 19-Jan-2012::00:34:21 ===
Error in process <0.97.0> with exit value: 
{{badmatch,{error,eaddrinuse}},[{my,'-       start/2-fun-0-',1}]}


=INFO REPORT==== 19-Jan-2012::00:34:21 ===
application: my
exited: {shutdown,{my_app,start,[normal,[noarg]]}}
type: temporary
{error,{shutdown,{my_app,start,[normal,[noarg]]}}}

3 个答案:

答案 0 :(得分:4)

my:start/2应该有两个参数,但在子规范中你只给它一个参数({8077,none})。您可以将子规格更改为:

{my, {my, start, [8077,none]}, permanent, brutal_kill, worker, [my]}

除此之外,您对主管规范的缩进和断线有点过分,因此很难看出属于哪些内容。

编辑:评论新错误

这与以前的问题不同。您收到一个新错误 eaddrinuse ,这通常意味着您正在尝试使用已在使用的IP地址/端口。这意味着你在代码中进行了一些套接字编程。

答案 1 :(得分:2)

你的主管指定我的:start应该接受一个参数,但它需要两个。您可能希望将子规范更改为:

{one_for_one, 10, 60},[{my, {my, start, [8077,none]}

答案 2 :(得分:0)

您的my:start/2提供了错误的返回值。 主管期望元组{ok,Pid},而您的函数只返回ok(最后一次调用是io:format,返回ok,因此您的函数也会这样做)。 如果要使用主管,则必须生成新进程并将其链接到主管。例如 start(_) -> {ok,spawn_link(fun() -> io:format("~w started~n",[self()]),timer:sleep(5000),io:format("~w exiting~n",[self()]) end)}. 应该为你做好工作。