2009-10-02 18 views
9

Mam moduł genserver, który muszę uruchomić jako serwer działający w tle. Podczas rozwoju, użyłem standardowego terminala ERL uruchomić go jakoErlang erl_call powoduje, że moduł gen_server jest zamykany

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

Wszystko działało dobrze i byłem w stanie połączyć się z serwerem z innymi modułami.

Teraz potrzebuję uruchomić go jako serwer w sposób ciągły i natknąłem się na funkcję erl_call. A więc teraz:

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

Ale serwer uruchamia się, ale wyłącza się automatycznie. Włączyłem opcję -d, aby zobaczyć, co się dzieje. Oto, co widzę w pliku śledzenia debugowania:

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

Czy wiesz, co powoduje automatyczne wyłączenie serwera? Ślad nawet mówi, że przyczyna wypowiedzenia była normalna. Ale nie zainicjowałem rozwiązania.

Odpowiedz

12

erl_call wykorzystuje funkcje rpc na węzeł erlang zrobić swoją pracę - erl_call -sname Node M F A jest taka sama jak robi rpc:call(Node, M, F, A) z innego węzła erlang podłączonego do Node.

rpc:call ikra proces do wykonania M:F(A) który zapytał go, więc w Twoim przypadku będzie tarło proces, który wykonuje my_server:start_link() a następnie kończy działanie. Ponieważ my_server jest połączony z procesem rpc, zakończy działanie, gdy proces rpc wykona połączenie - proces rpc zostanie połączony i wyśle ​​sygnał wyjściowy do procesu my_server. Możesz go zobaczyć w raporcie o błędzie: Last message in was {'EXIT',<0.59.0>,normal} - jest to sygnał wyjścia z procesu rpc, który wyłącza twój my_server.

Podejrzewam, że albo chce zadzwonić my_server:start() zamiast, tak że my_server nie będzie powiązany z procesem rpc i przetrwa proces rpc wychodzącego. Co jeszcze lepsze, utwórz aplikację OTP, my_app, i nadzorcę najwyższego poziomu, my_sup, która rozpocznie się my_server po uruchomieniu węzła.


Adam podkreśla również, że funkcja nie obsługuje zakończyć sprawę terminate(normal, {20499,24596,28693,32790,36887,40984,45081}) i wywala gdy my_server jest zamykany.

5

Serwer wychodzący bo ktoś powiedział jej, aby to zrobić, dlatego widać to:

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

To może pochodzić z samej gen_server lub wysyłając wiadomość wyjścia do tego, jak to:

exit(PidOfServer, normal) 

Twój terminate/2 funkcja w gen_server wydaje się być uszkodzony, ponieważ nie przyjmuje argumentów podanych do niego (jeśli są one ważne, że jest). Właśnie dlatego masz awarię.

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