2009-10-02 4 views
9

Ich habe ein Genserver-Modul, das ich als ein Server im Hintergrund starten muss. Während der Entwicklung habe ich einen Standard erl Terminal zu starten alsErlang erl_call verursacht gen_server Modul zu beenden

$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> 

Alles funktionierte gut, und ich konnte den Server von anderen Modulen nennen.

Nun muss ich es kontinuierlich als Server ausführen und stolperte über die Funktion erl_call. So jetzt mache ich:

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

Aber der Server startet, aber schaltet sich automatisch aus. Ich habe die -d-Flagge aktiviert, um zu sehen, was schief läuft. Dies ist, was ich in der Debug-Trace-Datei sehe:

===== 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}]} 

Eine Idee, was verursacht den Server automatisch heruntergefahren? Die Spur sagt sogar, dass der Grund für die Beendigung normal war. Aber ich habe die Kündigung nicht eingeleitet.

Antwort

12

erl_call verwendet die rpc Funktionen auf einem erlang Knoten seine Arbeit zu tun - erl_call -sname Node M F A das gleiche ist wie rpc:call(Node, M, F, A) von einem anderen erlang Knoten verbunden Node tun.

rpc:call erzeugt einen Prozess zum Ausführen der M:F(A), dass Sie es gefragt, so in Ihrem Fall wird es einen Prozess, der my_server:start_link() ausführt und dann beendet. Da my_server mit dem RPC-Prozess verknüpft ist, wird es beendet, wenn der RPC-Prozess ausgeführt wird - der Prozess rpc ist mit verknüpft und sendet ein Beendigungssignal an den Prozess my_server. Sie können es in dem Fehlerbericht sehen: Last message in was {'EXIT',<0.59.0>,normal} - das ist das Ausgangssignal von rpc Prozess, der Ihre my_server herunterfährt.

Ich vermute, dass Sie entweder wollen my_server:start() stattdessen nennen, so dass die my_server nicht an den rpc Prozess verknüpft werden und wird den Prozess rpc Verlassen überleben. Besser noch, erstellen Sie eine OTP-Anwendung, my_app, und Top-Level-Supervisor, my_sup, die my_server startet, wenn der Knoten gestartet wird.


Adam weist darauf hin, dass auch Ihre beenden Funktion behandelt nicht die terminate(normal, {20499,24596,28693,32790,36887,40984,45081}) Fall und stürzt ab, wenn die my_server heruntergefahren wird.

5

Der Server verlässt, wird, weil jemand es gesagt, dies zu tun, das ist, warum diese sehen:

Last message in was {'EXIT',<0.59.0>,normal} 

Es sind aus dem gen_server kommen könnte selbst oder durch eine Exit-Nachricht an sie zu senden, wie folgt aus:

exit(PidOfServer, normal) 

Ihre terminate/2 Funktion in Ihrem gen_server scheint fehlerhaft zu sein, da sie nicht die Argumente gegeben akzeptiert (wenn sie gültig sind, das ist). Deshalb bekommst du einen Absturz.

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