尝试终止子进程时出现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