2011-09-11 36 views
5

मेरे पास एक सिस्टम एम्बेडेड लिनक्स चला रहा है और यह महत्वपूर्ण है कि यह लगातार चलता है। असल में यह सेंसर से संचार करने और डाटाबेस और वेब क्लाइंट को उस डेटा को रिले करने की प्रक्रिया है।लिनक्स स्वचालित रूप से क्रैश पर एप्लिकेशन को पुनरारंभ करना - डेमन्स

यदि कोई क्रैश होता है, तो मैं एप्लिकेशन को स्वचालित रूप से पुनरारंभ कैसे करूं?

इसके अलावा, मतदान करने वाले कई धागे हैं (उदाहरण के लिए सॉकेट & यूर्ट संचार)। मैं कैसे सुनिश्चित करूं कि किसी भी धागे को लटकाया जाए या अप्रत्याशित रूप से बाहर निकलें? क्या वॉचडॉग का उपयोग करना आसान है जो थ्रेडिंग अनुकूल है?

उत्तर

6

यह का सार है:

  1. यदि प्रोग्राम अभी भी चल रहा है और लटका नहीं पता लगाने के लिए की जरूरत है।
  2. यदि प्रोग्राम नहीं चल रहा है या लटका हुआ है तो आपको कार्यक्रम शुरू करने की आवश्यकता है।

अलग अलग तरीकों की एक संख्या # 1 करने के लिए कर रहे हैं, लेकिन दो जो मन में आ रहे हैं:

  1. एक UNIX डोमेन सॉकेट पर सुनकर, स्थिति अनुरोधों को हैंडल करने। एक बाहरी आवेदन तब पूछताछ कर सकता है कि एप्लिकेशन अभी भी ठीक है या नहीं। अगर इसे कुछ समय अवधि के भीतर कोई प्रतिक्रिया नहीं मिलती है, तो यह माना जा सकता है कि पूछे जाने वाले आवेदन को मृतक किया गया है या मृत है।

  2. समय-समय पर पूर्व निर्धारित पथ वाली फ़ाइल को स्पर्श करना। एक बाहरी एप्लिकेशन फ़ाइल के लिए टाइमस्टैम्प देख सकता है, और यदि यह पुराना है, तो यह मान सकता है कि एप्लाइज़ेशन मर चुका है या डेडलाक्ड है।

# 2 के संबंध में, पिछले पीआईडी ​​को मारना और नई प्रक्रिया लॉन्च करने के लिए कांटा + निष्पादन का उपयोग करना सामान्य है। आप अपने आवेदन को बनाने पर भी विचार कर सकते हैं जो एक बार चलने वाले एप्लिकेशन में "निरंतर" चलता है, लेकिन उसके बाद "क्रॉन" या कुछ अन्य एप्लिकेशन का उपयोग उस एकल-रन एप्लिकेशन को लगातार चालू करने के लिए करें।

दुर्भाग्यवश, वॉचडॉग टाइमर और डेडलॉक से बाहर निकलना गैर-मामूली समस्याएं हैं। मुझे ऐसा करने के किसी भी सामान्य तरीके से नहीं पता, और जो कुछ मैंने देखा है वे बहुत बदसूरत हैं और 100% बग-फ्री नहीं हैं। हालांकि, tsan स्थैतिक विश्लेषण के साथ संभावित डेडलॉक परिदृश्यों और अन्य थ्रेडिंग समस्याओं का पता लगाने में मदद कर सकता है।

+0

किसी भी शुरू करने के लिए बॉक्स डेमॉन से बाहर डेमॉन देख सकते हैं और उन्हें पुन: प्रारंभ करने haha ​​कर सकते हैं चलाने के लिए इस स्क्रिप्ट? – user623879

+1

कई एम्बेडेड प्लेटफार्मों पर आप अपने वॉचडॉग डिमन को हार्डवेयर वॉचडॉग प्रोडक्ट कर सकते हैं, यह सुनिश्चित करना कि वॉचडॉग मर नहीं जाता है – Hasturkun

+0

मैं अपने आवेदन को समायोजित करने के सुझाव को दूसरा करना चाहता हूं ताकि यह केवल एक बार चलता है, और फिर उस सिंगल- बार-बार आवेदन चलाएं। " यदि यह संभव है, तो यह पहचान प्रक्रिया को काफी सरल बना देगा। –

6

in this answer वर्णित अनुसार fork और waitpid के साथ आप अपनी प्रक्रिया को सहजता से पुनरारंभ कर सकते हैं। इसका कोई महत्वपूर्ण संसाधन नहीं है, क्योंकि ओएस मेमोरी पेज साझा करेगा।

जो केवल लटका प्रक्रिया का पता लगाने की समस्या छोड़ देता है। आप इसके लिए माइकल हारून सफान द्वारा दिए गए किसी भी समाधान का उपयोग कर सकते हैं, लेकिन एक आसान समाधान समाधानसिस्कल का बार-बार उपयोग करना होगा, सिग्नल प्रक्रिया को समाप्त कर देगा (तदनुसार सिग्नेक्शन का उपयोग करें)। जब तक आप alarm पर कॉल करते रहें (यानी जब तक आपका प्रोग्राम चल रहा हो) यह चल रहा रहेगा। एक बार जब आप नहीं करेंगे, संकेत आग लग जाएगा।
इस तरह, कोई अतिरिक्त कार्यक्रम की आवश्यकता नहीं है, और केवल पोर्टेबल POSIX सामान का उपयोग किया जाता है।

1

यदि प्रक्रिया समय-समय पर शुरू रोकने के डेमॉन साथ चल रहा है की जाँच करने के लिए एक क्रॉन जॉब बना सकते हैं।

0

उपयोग आपके आवेदन

#!/bin/bash 

while ! /path/to/program #This will wait for the program to exit successfully. 
do 
echo “restarting”     # Else it will restart. 
done 

आप भी अन्य में अपने /etc/init.d/ पर इस स्क्रिप्ट को डेमॉन के रूप में