2010-06-16 17 views
5

मैं हाल ही में एक बग जहां एक पूरे Erlang आवेदन की मृत्यु हो गई में भाग गया, कि इस तरह देखा एक लॉग संदेश उपज:स्वचालित रूप से पुन: प्रारंभ Erlang अनुप्रयोगों

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

मुझे नहीं पता कि क्या यह बंद शुरू हो रहा है, लेकिन वास्तविक समस्या मेरे पास है है कि यह खुद को पुनरारंभ नहीं किया है। इसके बजाए, अब खाली खाली एरलांग वीएम बस कुछ भी नहीं कर रहा था।

अब, अनुसंधान मेरे द्वारा की गई से, यह अन्य की तरह देखते हैं "शुरू प्रकार" आप एक आवेदन दे सकते हैं लग रहा है: 'क्षणिक' और 'स्थायी'।

यदि मैं किसी एप्लिकेशन के भीतर एक पर्यवेक्षक शुरू, मैं एक विशेष प्रक्रिया क्षणिक या स्थायी बनाने के लिए यह बता सकते हैं, और यह अपने आप मेरे लिए पुनः आरंभ करेगा। हालांकि, दस्तावेज़ के अनुसार, अगर मैं एक आवेदन क्षणिक या स्थायी बनाने के लिए, यह उसे पुन: प्रारंभ नहीं होता है जब यह मर जाता है, बल्कि यह रूप में अच्छी तरह अन्य सभी अनुप्रयोगों को मारता है।

क्या मैं सच में करना चाहते हैं Erlang वीएम बताते हैं कि एक विशेष हमेशा चलते रहने होना चाहिए किसी भी तरह है, और अगर यह नीचे चला जाता है, उसे पुन: प्रारंभ। क्या ऐसा करना संभव है?

(मैं अपने आवेदन के शीर्ष पर पर्यवेक्षक को लागू करने के बारे में बात नहीं कर रहा हूं, क्योंकि तब यह एक पकड़ 22 है: अगर मेरा पर्यवेक्षक प्रक्रिया दुर्घटनाग्रस्त हो जाए तो क्या होगा? मैं किसी प्रकार की एपीआई या सेटिंग की तलाश कर रहा हूं जिसका उपयोग मैं कर सकता हूं Erlang मॉनिटर है और मेरे लिए मेरे आवेदन को पुनरारंभ करें।)

धन्यवाद!

उत्तर

5

आप शीर्ष स्तर के पर्यवेक्षक में इसे ठीक करने में सक्षम होना चाहिए: पुनः आरंभ रणनीति निर्धारित एक लाख पुनरारंभ हर दूसरे अनुमति देने के लिए, और आवेदन दुर्घटना कभी नहीं करना चाहिए। कुछ की तरह:

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

(। उदाहरण OTP Design Principles User Guide से रूपांतरित)

+0

ग्रेट, आपके उत्तर के लिए बहुत बहुत धन्यवाद। अब मैं देखता हूं कि मरने का कारण वास्तव में था क्योंकि अधिकतम पुनरारंभ सीमा हिट हुई थी। मैं जरूरी नहीं कि केवल इसे निष्क्रिय करना चाहता हूं, क्योंकि अगर यह वास्तव में रीस्टार्ट लूप में आता है तो हमें पूरे ऐप को पुनरारंभ करने की आवश्यकता हो सकती है। ऐप को बंद करने के बजाय, AllowedRestarts/MaxSeconds सीमा हिट होने पर ऐप को पुनरारंभ करने का कोई तरीका है? – Nick

+1

यदि आप वर्णन करते हैं कि आप अपने पर्यवेक्षक को पर्यवेक्षक जोड़ देंगे। ओटीपी का उपयोग करने वाला व्यवहार यह है कि जब प्रक्रिया में एक एक्जिट सिग्नल भेजा जाता है जो एप्लिकेशन को प्रारंभ कॉल करता है (यानी।जब शीर्ष स्तर पर्यवेक्षक मर जाता है) यह मानता है कि एप्लिकेशन त्रुटि को ठीक करने में विफल रहा है और यह कॉन्फ़िगरेशन के आधार पर एप्लिकेशन को बंद कर देगा और नोड संभव होगा। मुझे लगता है कि बिंदु यह है कि आपके अनुप्रयोगों को क्रैश नहीं करना चाहिए, और अगर वे त्रुटि करते हैं तो केवल नोड पुनरारंभ करने के लिए पर्याप्त गंभीर है। – Lukas

+0

लिंक 404 है - किसी के पास अपडेट है ....? – jisaacstone

4

आप अगर यह नीचे चला जाता है पूरे वी एम को पुनः आरंभ करने heart उपयोग करते हैं, तो एक स्थायी आवेदन प्रकार का उपयोग कर सकते हैं सुनिश्चित करें कि वीएम छोड़कर चला जाता बनाने के लिए आपका आवेदन निकलता है

आखिरकार आपको अपने आवेदन के ऊपर कुछ चाहिए जो आपको भरोसा करने की ज़रूरत है, भले ही यह पर्यवेक्षक प्रक्रिया हो, एरलांग वीएम, या आपके द्वारा लिखी गई कुछ शैल स्क्रिप्ट - यदि यह विफल होने पर भी हमेशा एक समस्या होगी।

+0

ठीक है, धन्यवाद। इस तरह के समाधान इस मामले में मेरे लिए ठीक काम करेंगे। हालांकि, अगर मैं एक से अधिक आवेदन एक बार में चलाने के लिए चाहता था, और उन्हें आवश्यकतानुसार स्वतंत्र रूप से पुनरारंभ करना है? सभी फैंसी प्रक्रिया पर्यवेक्षण सुविधाओं के साथ एरलांग में शामिल हैं, मुझे यह आश्चर्यजनक लगता है कि जब मैं नीचे जाता हूं तो एप्लिकेशन को पुनरारंभ करने के रूप में कुछ आसान नहीं लगता है .... – Nick

3

उपयोग Monit, तो सेटअप आपके आवेदन एक उचित पुनः आरंभ आवृत्ति के साथ पूरे आवेदन के लिए एक पर्यवेक्षक का उपयोग करके समाप्त करने के लिए। यदि आवेदन समाप्त हो जाता है, तो वीएम समाप्त हो जाता है, और monit सबकुछ पुनरारंभ करता है।

मैं कभी नहीं मिल दिल के रूप में यह केवल एक बार वीएम पुन: प्रारंभ होता है, और यह erlang वी एम की एक मार -9 के साथ अच्छी तरह से निपटने के नहीं है, काफी विश्वसनीय हो सकती है।

संबंधित मुद्दे