2010-06-16 39 views
5

Gần đây tôi đã chạy vào một lỗi khi cả một ứng dụng Erlang chết, năng suất nhắn log trông như thế này:Tự động khởi động lại ứng dụng Erlang

=INFO REPORT==== 11-Jun-2010::11:07:25 === 
    application: myapp 
    exited: shutdown 
    type: temporary 

Tôi không có ý tưởng những gì kích hoạt tắt máy này, nhưng vấn đề thực sự tôi có là nó đã không tự khởi động lại. Thay vào đó, máy ảo Erlang hiện đang trống rỗng chỉ ngồi đó không làm gì cả.

Bây giờ, từ các nghiên cứu tôi đã thực hiện, có vẻ như có khác "bắt đầu loại" bạn có thể đưa ra một ứng dụng: 'thoáng' và 'vĩnh cửu'.

Nếu tôi bắt đầu một Supervisor trong một ứng dụng, tôi có thể nói nó để thực hiện một quy trình cụ thể thoáng qua hoặc vĩnh viễn, và nó sẽ tự động khởi động lại nó cho tôi. Tuy nhiên, theo các tài liệu, nếu tôi thực hiện một ứng dụng thoáng qua hoặc vĩnh viễn, nó không khởi động lại nó khi nó chết, mà đúng hơn là nó giết chết tất cả các các ứng dụng khác nữa.

Những gì tôi thực sự muốn làm là bằng cách nào đó nói với Erlang VM rằng một ứng dụng cụ thể nên luôn luôn chạy, và nếu nó đi xuống, khởi động lại nó. Đây có phải là có thể làm gì?

(Tôi không nói về việc triển khai người giám sát ở đầu đơn đăng ký của mình, vì đó là điểm bắt 22: nếu quá trình giám sát của tôi bị treo? Tôi đang tìm một số loại API hoặc cài đặt mà tôi có thể sử dụng để có theo dõi Erlang và khởi động lại ứng dụng của tôi cho tôi.)

Cảm ơn!

Trả lời

5

Bạn sẽ có thể sửa lỗi này trong người giám sát cấp cao nhất: thiết lập chiến lược khởi động lại để cho phép một triệu khởi động lại mỗi giây, và các ứng dụng không bao giờ nên sụp đổ. Một cái gì đó như:

init(_Args) -> 
    {ok, {{one_for_one, 1000000, 1}, 
      [{ch3, {ch3, start_link, []}, 
      permanent, brutal_kill, worker, [ch3]}]}}.

(. Ví dụ chuyển thể từ OTP Design Principles User Guide)

+0

Tuyệt vời, cảm ơn rất nhiều vì câu trả lời của bạn. Tôi thấy bây giờ lý do nó chết thực sự là vì giới hạn khởi động lại tối đa đã được nhấn. Tôi không nhất thiết muốn chỉ cần vô hiệu hóa rằng mặc dù, vì nếu nó thực sự được vào một vòng lặp khởi động lại sau đó chúng tôi có thể cần phải khởi động lại toàn bộ ứng dụng. Có cách nào để khởi động lại ứng dụng nếu giới hạn AllowedRestarts/MaxSeconds được nhấn hay không, thay vì tắt ứng dụng? – Nick

+1

Trong trường hợp bạn mô tả bạn sẽ thêm người giám sát cho người giám sát của bạn. Hành vi mà OTP sử dụng là khi tín hiệu thoát được gửi đến quá trình thực hiện cuộc gọi bắt đầu đến ứng dụng (tức làkhi giám sát viên cấp cao chết), giả định rằng ứng dụng đã không sửa được lỗi và nó sẽ tắt ứng dụng và có thể nút phụ thuộc vào cấu hình. Tôi đoán điểm là các ứng dụng của bạn sẽ không bị lỗi, và nếu chúng thực hiện các lỗi nghiêm trọng, đủ để chỉ được giải quyết bằng cách khởi động lại nút. – Lukas

+0

Liên kết là 404 - bất kỳ ai có cập nhật ....? – jisaacstone

4

Bạn có thể sử dụng heart để khởi động lại toàn bộ máy ảo nếu nó đi xuống, sau đó sử dụng một loại ứng dụng vĩnh viễn để đảm bảo rằng VM thoát khi ứng dụng của bạn thoát. Cuối cùng bạn cần một cái gì đó trên ứng dụng của bạn mà bạn cần phải tin tưởng, cho dù đó là một quá trình giám sát, máy ảo erlang, hoặc một số kịch bản shell bạn đã viết - nó sẽ luôn luôn là một vấn đề nếu điều đó xảy ra thất bại cũng có.

+0

Ok, cảm ơn. Đó là loại giải pháp sẽ làm việc tốt cho tôi trong trường hợp này. Tuy nhiên, điều gì xảy ra nếu tôi muốn chạy nhiều ứng dụng cùng một lúc và yêu cầu chúng khởi động lại độc lập khi cần thiết? Với tất cả các tính năng giám sát quá trình ưa thích Erlang bao gồm, tôi thấy nó tuyệt vời mà tôi dường như không thể làm một cái gì đó đơn giản như khởi động lại một ứng dụng khi nó đi xuống .... – Nick

3

Sử dụng Monit, sau đó thiết lập ứng dụng của bạn để chấm dứt bằng cách sử dụng người giám sát cho toàn bộ ứng dụng với tần suất khởi động lại hợp lý. Nếu ứng dụng kết thúc, máy ảo chấm dứt và khởi động lại tất cả mọi thứ.

Tôi không bao giờ có thể nhận được tim là đáng tin cậy đủ, vì nó chỉ khởi động lại máy ảo một lần, và nó không đối phó tốt với một kill -9 của erlang VM.

Các vấn đề liên quan