Невозможно запустить простое приложение на Erlang - PullRequest
3 голосов
/ 18 января 2012

Я написал простое приложение на 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 ]

4 голосов
/ 18 января 2012

my:start/2 должен принимать два аргумента, но в дочерней спецификации вы даете ему только один аргумент ({8077,none}). Вы можете изменить дочернюю спецификацию на:

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

Кроме того, ваши отступы и разрыв строки в Спецификации супервизора немного мешают понять, что к чему относится.

РЕДАКТИРОВАТЬ: Комментарий к новой ошибке

Это не та же проблема, что и раньше. Вы получаете новую ошибку eaddrinuse , которая обычно означает, что вы пытаетесь использовать IP-адрес / порт, который уже используется. Это подразумевает, что вы выполняете программирование сокетов в своем коде.

2 голосов
/ 18 января 2012

Ваш супервизор указывает, что my: start должен принимать один аргумент, но он принимает два. Вы, вероятно, хотите изменить дочернюю спецификацию на:

{one_for_one, 10, 60},[{my, {my, start, [8077,none]}
0 голосов
/ 10 января 2013

Ваш my:start/2 предоставляет неправильное возвращаемое значение. Supervisor ожидает кортеж {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)}. должен сделать эту работу за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...