Erlang erl_call 导致 gen_server 模块退出

9
我有一个genserver模块,需要将其启动为后台运行的服务器。在开发过程中,我使用了标准的erl终端来启动它:
$erl
Erlang R13B01 (erts-5.7.2) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.2  (abort with ^G)
1> myserver:start_link().
<ok, some_pid>

一切都很顺利,我能够从其他模块调用服务器。

现在,我需要持续地将其作为服务器运行,并遇到了erl_call函数。所以现在我这样做:

erl_call -d -s -a 'myserver start_link' -sname myserver_node

但是,服务器启动后会自动关闭。我启用了-d标志以查看出了什么问题。这是在调试跟踪文件中看到的:

===== Log started ======
Fri Oct  2 04:42:32 2009

erl_call: sh -c exec erl -noinput -sname myserver_node -s erl_reply reply 174.143.175.70 42457 5882

=ERROR REPORT==== 2-Oct-2009::04:44:05 ===
** Generic server myserver terminating
** Last message in was {'EXIT',<0.59.0>,normal}
** When Server state == {20499,24596,28693,32790,36887,40984,45081}
** Reason for termination ==
** {function_clause,[{myserver,terminate,
                               [normal,
                                {20499,24596,28693,32790,36887,40984,45081}]},
                     {gen_server,terminate,6},
                     {proc_lib,init_p_do_apply,3}]}

有没有想法是什么原因导致服务器自动关闭?跟踪甚至显示终止原因是正常的。但我没有发起终止。

2个回答

12

erl_call使用erlang节点上的rpc函数来完成其工作 - erl_call -sname Node M F A与从连接到Node的不同的erlang节点执行rpc:call(Node, M, F, A)是相同的。

rpc:call会生成一个进程来执行您请求的M:F(A),因此在您的情况下,它将生成一个执行my_server:start_link()然后退出的进程。由于my_server与rpc进程链接,当rpc进程退出时,my_server也将退出 - rpc进程链接并向my_server进程发送退出信号。您可以在错误报告中看到这一点:Last message in was {'EXIT',<0.59.0>,normal} - 这是来自关闭您的my_serverrpc进程的退出信号。

我猜您可能希望调用my_server:start(),这样my_server就不会与rpc进程链接,并且可以在rpc进程退出时幸存。更好的方法是创建一个OTP应用程序my_app和顶级监视器my_sup,并在节点启动时启动my_server


Adam还指出,您的终止函数未处理terminate(normal, {20499,24596,28693,32790,36887,40984,45081})情况,并在my_server关闭时崩溃。


5
服务器正在退出,因为有人告诉它这样做,这就是你看到这个的原因:
Last message in was {'EXIT',<0.59.0>,normal}

这个错误信息可能来自于gen_server本身,或者是通过发送退出消息给它而产生的,例如:

exit(PidOfServer, normal)

你的gen_server中的terminate/2函数似乎存在问题,因为它不接受给定的参数(如果它们是有效的)。这就是为什么出现崩溃的原因。

** {function_clause,[{myserver,terminate,
                           [normal,
                            {20499,24596,28693,32790,36887,40984,45081}]},
                 {gen_server,terminate,6},
                 {proc_lib,init_p_do_apply,3}]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接