尝试终止子进程时出现Erlang noproc错误

尝试终止子进程时出现Erlang noproc错误,erlang,Erlang,我试图设计一个服务器,当它收到请求时启动临时进程。然而,当我试图终止或终止临时进程时,我得到了noproc错误。有人能告诉我如何解决这个问题吗 我得到了以下文件: 临时工程师(主要主管) 临时srv.erl(服务器) 临时助理(主管启动临时流程) 设计应在临时主管启动后启动三个临时流程,一旦收到请求,将终止一个已完成工作的临时流程 我就是这样运行这些代码的: 9> temp:start_link(). ****Main supervisor**** ****Temp super

我试图设计一个服务器,当它收到请求时启动临时进程。然而,当我试图终止或终止临时进程时,我得到了
noproc
错误。有人能告诉我如何解决这个问题吗

我得到了以下文件:

临时工程师(主要主管)

临时srv.erl(服务器)

临时助理(主管启动临时流程)

设计应在临时主管启动后启动三个临时流程,一旦收到请求,将终止一个已完成工作的临时流程

我就是这样运行这些代码的:

9> temp:start_link().      
****Main supervisor****
****Temp supervisor*****
Start temporary worker process <0.98.0>
{ok,<0.94.0>}
Start temporary worker process <0.99.0>
Start temporary worker process <0.101.0>
10> temp_srv:echo_call(asd).
Find available children <0.98.0>
Start temporary worker process <0.102.0>
Assign task to <0.98.0>
<0.98.0> get echo request for message asd
asd
11> temp_srv:echo_call(asd).
Find process <0.98.0> to kill

=ERROR REPORT==== 23-May-2017::23:16:34 ===
** Generic server temp_srv terminating 
** Last message in was {echo,asd}
** When Server state == {state}
** Reason for termination == 
** {{noproc,{gen_server,call,[<0.98.0>,check_status]}},
    [{gen_server,call,2,[{file,"gen_server.erl"},{line,204}]},
     {temp_sup,select_available_children,1,[{file,"temp_sup.erl"},{line,41}]},
     {temp_sup,assign_task,1,[{file,"temp_sup.erl"},{line,33}]},
     {temp_srv,handle_call,3,[{file,"temp_srv.erl"},{line,21}]},
     {gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,615}]},
     {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,647}]},
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}

=ERROR REPORT==== 23-May-2017::23:16:34 ===
** Generic server temp terminating 
** Last message in was {'EXIT',<0.92.0>,
                           {{{noproc,
                                 {gen_server,call,[<0.98.0>,check_status]}},
                             {gen_server,call,[temp_srv,{echo,asd}]}},
                            [{gen_server,call,2,
                                 [{file,"gen_server.erl"},{line,204}]},
                             {erl_eval,do_apply,6,
                                 [{file,"erl_eval.erl"},{line,674}]},
                             {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
                             {shell,eval_exprs,7,
                                 [{file,"shell.erl"},{line,641}]},
                             {shell,eval_loop,3,
                                 [{file,"shell.erl"},{line,626}]}]}}
** When Server state == {state,
                            {local,temp},
                            one_for_one,
                            [{child,<0.96.0>,temp_sup,
                                 {temp_sup,start_link,[]},
                                 permanent,infinity,supervisor,
                                 [temp_sup]},
                             {child,<0.104.0>,temp_srv,
                                 {temp_srv,start_link,[]},
                                 permanent,infinity,worker,
                                 [temp_srv]}],
                            undefined,5,10,
                            [-576459529],
                            0,temp,[]}
** Reason for termination == 
** {{{noproc,{gen_server,call,[<0.98.0>,check_status]}},
     {gen_server,call,[temp_srv,{echo,asd}]}},
    [{gen_server,call,2,[{file,"gen_server.erl"},{line,204}]},
     {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]},
     {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
     {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]},
     {shell,eval_loop,3,[{file,"shell.erl"},{line,626}]}]}
** exception exit: {{noproc,{gen_server,call,[<0.98.0>,check_status]}},
                    {gen_server,call,[temp_srv,{echo,asd}]}}
     in function  gen_server:call/2 (gen_server.erl, line 204)
9>临时:启动链接()。
****主要主管****
****临时主管*****
启动临时工流程
{好的,}
启动临时工流程
启动临时工流程
10> 临时srv:回音呼叫(asd)。
查找可用的孩子
启动临时工流程
分配任务给
获取消息asd的回显请求
自闭症
11> 临时srv:回音呼叫(asd)。
找到要杀死的进程
=错误报告===2017年5月23日::23:16:34===
**通用服务器临时srv终止
**最后一条消息是{echo,asd}
**当服务器状态=={state}
**终止原因==
**{{noproc,{gen_server,call,[,check_status]},
[{gen_server,call,2,[{file,“gen_server.erl”},{line,204}]},
{temp_sup,选择可用的子项,1,[{file,“temp_sup.erl”},{line,41}]},
{temp_sup,assign_task,1,[{file,“temp_sup.erl”},{line,33}]},
{temp_srv,handle_call,3,[{file,“temp_srv.erl”},{line,21}]},
{gen_server,try_handle_call,4,[{file,“gen_server.erl”},{line,615}]},
{gen_server,handle_msg,5,[{file,“gen_server.erl”},{line,647}]},
{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,247}]}
=错误报告===2017年5月23日::23:16:34===
**通用服务器临时终止
**中的最后一条消息是{'EXIT',,
{{{{noproc,
{gen_server,call,[,check_status]},
{gen_server,call,[temp_srv,{echo,asd}},
[{gen_服务器,呼叫,2,
[{file,“gen_server.erl”},{line,204}]},
{erl_eval,是否适用,6,
[{file,“erl_eval.erl”},{line,674}]},
{shell,exprs,7,[{file,“shell.erl”},{line,686}]},
{shell,eval_exprs,7,
[{file,“shell.erl”},{line,641}]},
{shell,eval_loop,3,
[{file,“shell.erl”},{line,626}]}}
**当服务器状态=={state,
{local,temp},
一对一,
[{儿童,临时助理,
{temp_sup,start_link,[]},
永久的,无限的,管理者,
[temp_sup]},
{child,,temp_srv,
{temp_srv,start_link,[]},
永久的,无限的,工人,
[temp_srv]}],
未定义,5,10,
[-576459529],
0,临时,[]}
**终止原因==
**{{{noproc,{gen_server,call,[,check_status]},
{gen_server,call,[temp_srv,{echo,asd}},
[{gen_server,call,2,[{file,“gen_server.erl”},{line,204}]},
{erl_eval,do_apply,6,[{文件,“erl_eval.erl”},{line,674}]},
{shell,exprs,7,[{file,“shell.erl”},{line,686}]},
{shell,eval_exprs,7,[{file,“shell.erl”},{line,641}]},
{shell,eval_循环,3,[{file,“shell.erl”},{line,626}]}
**异常退出:{{noproc,{gen_server,call,[,check_status]},
{gen_server,call,[temp_srv,{echo,asd}}}
在函数gen_server:call/2中(gen_server.erl,第204行)
来自:

noproc--尝试链接到不存在的进程

错误消息表示有问题的行是:

case gen_server:call(Pid, check_status) of
这意味着Pid是一个不存在的过程。在输出中,您可以看到:

Assign task to <0.98.0>
<0.98.0> get echo request for message asd
asd
然后,您的代码执行以下操作:

select_available_children([ChildH | ChildT]) ->
    {undefined, Pid, worker, [temp_worker]} = ChildH,
    case gen_server:call(Pid, check_status) of

ChildH
包含已终止的pid
,该pid绑定到
pid
。然后执行
gen\u server:call(Pid)
,这会导致
noproc
错误。

我使用进程信息检查进程,结果显示进程仍然处于活动状态,其状态正在等待。@billcyz,现在开始。在它说状态为等待后,没有出现错误。您什么时候检查流程的?如果您在erlang崩溃后进行了检查,那么您将找不到任何东西,如果它的主管不在了。@billcyz,添加我显示的行,按照您在问题中所做的方式运行代码,在输出中找到错误消息,向上滚动到错误的第一行,然后告诉我错误消息第一行之前的第一行说了什么?问题解决了。我认为孩子名单是问题的根源。我把我的代码改为:分配任务(数据)->案例选择完成的子项(列表子项()),将没有pid的子项分配给杀死->确定;{ok,KPid}->stopped=gen_server:call(KPid,stop)end,问题解决了。
9> temp:start_link().      
****Main supervisor****
****Temp supervisor*****
Start temporary worker process <0.98.0>
{ok,<0.94.0>}
Start temporary worker process <0.99.0>
Start temporary worker process <0.101.0>
10> temp_srv:echo_call(asd).
Find available children <0.98.0>
Start temporary worker process <0.102.0>
Assign task to <0.98.0>
<0.98.0> get echo request for message asd
asd
11> temp_srv:echo_call(asd).
Find process <0.98.0> to kill

=ERROR REPORT==== 23-May-2017::23:16:34 ===
** Generic server temp_srv terminating 
** Last message in was {echo,asd}
** When Server state == {state}
** Reason for termination == 
** {{noproc,{gen_server,call,[<0.98.0>,check_status]}},
    [{gen_server,call,2,[{file,"gen_server.erl"},{line,204}]},
     {temp_sup,select_available_children,1,[{file,"temp_sup.erl"},{line,41}]},
     {temp_sup,assign_task,1,[{file,"temp_sup.erl"},{line,33}]},
     {temp_srv,handle_call,3,[{file,"temp_srv.erl"},{line,21}]},
     {gen_server,try_handle_call,4,[{file,"gen_server.erl"},{line,615}]},
     {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,647}]},
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}

=ERROR REPORT==== 23-May-2017::23:16:34 ===
** Generic server temp terminating 
** Last message in was {'EXIT',<0.92.0>,
                           {{{noproc,
                                 {gen_server,call,[<0.98.0>,check_status]}},
                             {gen_server,call,[temp_srv,{echo,asd}]}},
                            [{gen_server,call,2,
                                 [{file,"gen_server.erl"},{line,204}]},
                             {erl_eval,do_apply,6,
                                 [{file,"erl_eval.erl"},{line,674}]},
                             {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
                             {shell,eval_exprs,7,
                                 [{file,"shell.erl"},{line,641}]},
                             {shell,eval_loop,3,
                                 [{file,"shell.erl"},{line,626}]}]}}
** When Server state == {state,
                            {local,temp},
                            one_for_one,
                            [{child,<0.96.0>,temp_sup,
                                 {temp_sup,start_link,[]},
                                 permanent,infinity,supervisor,
                                 [temp_sup]},
                             {child,<0.104.0>,temp_srv,
                                 {temp_srv,start_link,[]},
                                 permanent,infinity,worker,
                                 [temp_srv]}],
                            undefined,5,10,
                            [-576459529],
                            0,temp,[]}
** Reason for termination == 
** {{{noproc,{gen_server,call,[<0.98.0>,check_status]}},
     {gen_server,call,[temp_srv,{echo,asd}]}},
    [{gen_server,call,2,[{file,"gen_server.erl"},{line,204}]},
     {erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,674}]},
     {shell,exprs,7,[{file,"shell.erl"},{line,686}]},
     {shell,eval_exprs,7,[{file,"shell.erl"},{line,641}]},
     {shell,eval_loop,3,[{file,"shell.erl"},{line,626}]}]}
** exception exit: {{noproc,{gen_server,call,[<0.98.0>,check_status]}},
                    {gen_server,call,[temp_srv,{echo,asd}]}}
     in function  gen_server:call/2 (gen_server.erl, line 204)
case gen_server:call(Pid, check_status) of
Assign task to <0.98.0>
<0.98.0> get echo request for message asd
asd
    assign_task(Data) ->
        ...
        case select_finished_children(ChildL) of
            no_pid_to_kill -> ok;
            {ok, KPid} -> gen_server:call(KPid, stop)
        end,
        io:format("assign_task(): ChildL: ~w~n", [ChildL]),  %%<***HERE
        io:format("****Info: ~w~n", [process_info(Pid)]),    %%<***HERE
        {ok, Pid} = select_available_children(ChildL),
select_available_children([ChildH | ChildT]) ->
    {undefined, Pid, worker, [temp_worker]} = ChildH,
    case gen_server:call(Pid, check_status) of