erlang - 为什么我的主管在初始化时失败并带有 badarg?

标签 erlang erlang-otp erlang-supervisor

我正在尝试为一个 child 启动一个 one_for_one 类型的主管,但收到此错误:

A = pl:start().
{error,{badarg,[{erlang,apply,[{state,[0|1]},init,[[]]],[]},
                {supervisor,init,1,[{file,"supervisor.erl"},{line,295}]},
                {gen_server,init_it,2,[{file,"gen_server.erl"},{line,374}]},
                {gen_server,init_it,6,[{file,"gen_server.erl"},{line,342}]},
                {proc_lib,init_p_do_apply,3,
                          [{file,"proc_lib.erl"},{line,249}]}]}}
=CRASH REPORT==== 1-Mar-2020::15:28:41.090000 ===
  crasher:
    pid: <0.215.0>
    registered_name: []
    exception error: bad argument
      in function  apply/3
         called as apply({state,[0|1]},init,[[]])
      in call from supervisor:init/1 (supervisor.erl, line 295)
      in call from gen_server:init_it/2 (gen_server.erl, line 374)
      in call from gen_server:init_it/6 (gen_server.erl, line 342)
    ancestors: [<0.209.0>]
    message_queue_len: 0
    messages: []
    links: [<0.209.0>]
    dictionary: []
    trap_exit: true
    status: running
    heap_size: 376
    stack_size: 25
    reductions: 192
  neighbours:
    neighbour:
      pid: <0.209.0>
      registered_name: []
      initial_call: {erlang,apply,2}
      current_function: {io,execute_request,2}
      ancestors: []
      message_queue_len: 0
      links: [<0.63.0>,<0.215.0>]
      trap_exit: false
      status: waiting
      heap_size: 1598
      stack_size: 25
      reductions: 5867
      current_stacktrace: [{io,execute_request,2,[{file,"io.erl"},{line,579}]},
                  {shell,exprs,7,[{file,"shell.erl"},{line,693}]},
                  {shell,eval_exprs,7,[{file,"shell.erl"},{line,642}]},
                  {shell,eval_loop,3,[{file,"shell.erl"},{line,627}]}]
** exception exit: badarg
     in function  apply/3
        called as apply({state,[0|1]},init,[[]])
     in call from supervisor:init/1 (supervisor.erl, line 295)
     in call from gen_server:init_it/2 (gen_server.erl, line 374)
     in call from gen_server:init_it/6 (gen_server.erl, line 342)
     in call from proc_lib:init_p_do_apply/3 (proc_lib.erl, line 249)

主管:

    -module(pl).
    -behaviour(supervisor).
    -export([start/0,init/1]).
    -record(state,{
        data=[]
    }).

    %% {ChildId, StartFunc, Restart, Shutdown, Type, Modules}
    start()->
        supervisor:start_link({local,?MODULE},#state{data=[0|1]},[]).

    init(State=#state{data=D})->
        InitialChild={fchild,{serv,start_link,[-1]},temporary,3000,brutal_kill,worker},
        MaxRestart=2,
        MaxTime=600,
        Strategy={one_for_one,MaxRestart,MaxTime},
        {ok,{Strategy,[
                InitialChild
        ]}}.

worker :

-module(serv).
-behaviour(gen_server).
-compile(export_all).
-define(A,300).
-record(state,{
    values=[],
    id
}).

call(Pid,Message)->
    gen_server:call(Pid,Message).

cast(Pid,Message)->
    gen_server:cast(Pid,Message).
start_link(Id)->
    {ok,Pid}=gen_server:start_link({local,xx},?MODULE,[Id],[]),
    Pid.
stop(Ref)->
    gen_server:stop(Ref).
init(Id)->
    {ok,#state{values=[],id=Id}}.
handle_call(state,From,State=#state{values=V})->
    Reply={reply,State,State},
    Reply;

我只是想启动一个只有一个子进程的主管,该子进程在其 init 方法中获取参数。这段代码有什么问题?

最佳答案

具有 3 个参数的 start_link 的第二个参数应该是模块名称;应该是

start()->
    supervisor:start_link({local,?MODULE}, ?MODULE, [#state{data=[0|1]}]).

关于erlang - 为什么我的主管在初始化时失败并带有 badarg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60475637/

相关文章:

erlang - 当我尝试从 eshell 启动时,我的主管崩溃了?

c++ - C 编译器无法创建可执行文件,OpenSolaris Erlang/OTP ./configure 错误

erlang - 当涉及多个参与者/进程时,如何计算 Elixir 中的 CPU 时间?

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

multithreading - Erlang 怎么 sleep (晚上?)

erlang - 卡在 {"init terminating in do_boot",{undef,[{rmbrDb,start,[],[]},

erlang - Erlang 中的变量

erlang - 监督树启动失败

erlang - 是否应该将客户端处理过程添加到主管树中?

erlang - 一次性密码 : how to supervise non-OTP components?