2009-10-02 7 views
9

Tôi có một mô-đun genserver mà tôi cần để bắt đầu như một máy chủ đang chạy ẩn. Trong quá trình phát triển, tôi đã sử dụng một thiết bị đầu cuối chuẩn để bắt đầu nó như làErlang erl_call khiến mô-đun gen_server thoát

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

Mọi thứ hoạt động tốt và tôi có thể gọi máy chủ từ các mô-đun khác.

Bây giờ, tôi cần phải chạy nó như một máy chủ liên tục và vấp ngã khi chức năng erl_call. Vì vậy, bây giờ tôi làm:

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

Nhưng, máy chủ khởi động, nhưng tắt tự động. Tôi đã kích hoạt cờ -d để xem có gì sai. Đây là những gì tôi thấy trong tệp theo dõi gỡ lỗi:

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

Bất kỳ ý tưởng nào khiến máy chủ tự động tắt? Dấu vết thậm chí còn nói lý do chấm dứt là bình thường. Nhưng tôi đã không bắt đầu chấm dứt.

Trả lời

12

erl_call sử dụng rpc chức năng trên một nút erlang để làm công việc của mình - erl_call -sname Node M F A cũng giống như làm rpc:call(Node, M, F, A) từ một nút erlang khác nhau kết nối với Node.

rpc:call tạo ra một quy trình để thực thi M:F(A) mà bạn đã yêu cầu, vì vậy trong trường hợp của bạn, nó sẽ sinh ra một quá trình thực hiện my_server:start_link() và sau đó thoát. Bởi vì my_server được liên kết với quá trình rpc, nó sẽ thoát khi quá trình rpc thực hiện - quy trình rpc được liên kết và gửi tín hiệu thoát tới quy trình my_server. Bạn có thể nhìn thấy nó trong báo cáo lỗi: Last message in was {'EXIT',<0.59.0>,normal} - đó là tín hiệu thoát từ quy trình rpc sẽ tắt số my_server của bạn.

Tôi nghi ngờ rằng bạn muốn gọi số my_server:start() thay vào đó, để my_server sẽ không được liên kết với quy trình rpc và sẽ tồn tại quá trình thoát rpc. Tốt hơn, hãy tạo ứng dụng OTP, my_app và người giám sát cấp cao nhất, my_sup, bắt đầu my_server khi nút bắt đầu.


Adam chỉ ra rằng cũng chấm dứt chức năng của bạn không xử lý các trường hợp terminate(normal, {20499,24596,28693,32790,36887,40984,45081}) và bị treo khi my_server đang tắt.

5

Các máy chủ được thoát vì có người nói với nó để làm như vậy, đó là lý do tại sao bạn thấy điều này:

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

Nó có thể đến từ các gen_server chính nó, hoặc bằng cách gửi một thông điệp cảnh với nó, như thế này:

exit(PidOfServer, normal) 

terminate/2 chức năng của bạn trong gen_server của bạn có vẻ là bị lỗi, vì nó không chấp nhận các đối số được cung cấp (nếu họ có giá trị, có nghĩa là). Đây là lý do tại sao bạn gặp sự cố.

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