2009-11-19 14 views
18

मैं विफलताओं के बाद एक मिनट की देरी के साथ पुनरारंभ करने के लिए विंडोज सेवाओं के लिए रिकवरी कॉन्फ़िगर करता हूं। लेकिन मैंने इसे वास्तव में सेवा को पुनरारंभ करने के लिए कभी नहीं मिला है (यहां तक ​​कि सबसे अधिक त्रुटिपूर्ण त्रुटियों के साथ)।विंडोज सेवा रिकवरी सेवा को पुनरारंभ नहीं कर रही

स्रोत (MyApp.exe) में ईवेंट ID (1) के लिए विवरण नहीं मिल सका:

मैं EventViewer में एक संदेश मिलता है। स्थानीय कंप्यूटर में रिमोट कंप्यूटर से संदेश प्रदर्शित करने के लिए आवश्यक रजिस्ट्री जानकारी या संदेश DLL फ़ाइलें नहीं हो सकती हैं। आप इस विवरण को पुनः प्राप्त करने के लिए/AUXSOURCE = ध्वज का उपयोग करने में सक्षम हो सकते हैं; विवरण के लिए सहायता और सहायता देखें। निम्न जानकारी घटना का हिस्सा है: मॉड्यूल 'MyApp.exe' में पते 00429874 पर उल्लंघन उल्लंघन। पता 00456704 का लिखें।

क्या मुझे कुछ और करना है? क्या मेरे कोड में कुछ है (मैं डेल्फी का उपयोग करता हूं) जिसे इसे सक्षम करने के लिए सेट करने की आवश्यकता है?

+0

यह प्रश्न http://stackoverflow.com/questions/220382/how-can-a-windows-service-programmatically-restart-itself?rq=1 –

उत्तर

19

सेवा रिकवरी का उद्देश्य उस मामले को संभालने का इरादा है जहां एक सेवा दुर्घटनाग्रस्त हो जाती है - इसलिए यदि आप taskmgr पर जाते हैं और अपनी सेवा प्रक्रिया पर "अंत प्रक्रिया" पर राइट क्लिक करते हैं, तो रिकवरी तर्क को लात मारना चाहिए। मुझे विश्वास नहीं है कि सेवा वसूली तर्क अगर आपकी सेवा शानदार तरीके से निकलती है (भले ही यह किसी त्रुटि से निकलती हो)।

इसके अलावा eventvwr संदेश इंगित करता है कि आपके एप्लिकेशन को ईवेंट आईडी निर्दिष्ट करने वाले ReportEvent API कहा जाता है। लेकिन आपने ईवेंट ईवेंट के साथ अपने ईवेंट संदेश पंजीकृत नहीं किए हैं, इसलिए यह ईवेंट आईडी 1 को सार्थक टेक्स्ट स्ट्रिंग में परिवर्तित नहीं कर सकता है।

+1

मदद कर सकता है धन्यवाद। इसने स्थिति पर कुछ प्रकाश डाला। मैंने पाया कि जब मैंने taskmgr से "एंड प्रोसेस" किया था तो यह इवेंट व्यूअर में इसका उत्पादन करता है: 60000 मिलीसेकंड में निम्न सुधारात्मक कार्रवाई की जाएगी: सेवा को पुनरारंभ करें। अब मेरी समस्या (जो मेरे कोडिंग से संबंधित है) है कि इसे "अन-ग्रेस से" समाप्त कर दिया जाए ताकि पुनर्प्राप्ति तर्क लाएगा। –

+1

यदि आप एक्जिटप्रोसेस को कॉल करते हैं जो पर्याप्त होना चाहिए। –

8

सेवा रिकवरी केवल अप्रत्याशित निकास के लिए काम करती है (निकास (-1)) कॉल करें। सामान्य रूप से सेवा को रोकने के लिए हम जिस तरह से उपयोग करते हैं, वसूली के लिए काम नहीं करेगा। यदि आप सेवा को रोकना चाहते हैं और अभी भी वसूली करना चाहते हैं, तो से बाहर निकलें (-1) और आपको त्रुटि संदेश "अप्रत्याशित त्रुटि के साथ बंद कर दिया गया" के रूप में दिखाई देगा, और फिर आपकी सेवा पुनर्प्राप्ति सेटिंग के रूप में पुनरारंभ होगी।

+0

+1 आपके उत्तर के लिए धन्यवाद। मुझे बहुत मदद मिली – Jehof

+2

सटीक विधि की तलाश करने वालों के लिए, पर्यावरण का प्रयास करें। एक्सिट (-1); –

0

यदि आप कार्य प्रबंधक से सेवा 'मार' करते हैं - वसूली तर्क के लिए भूल गए हैं। 'स्टॉप सर्विस' द्वारा पृष्ठभूमि कार्य प्रबंधक 'हत्या' प्रक्रिया में। और जैसा कि आप अनुमान लगा सकते हैं - यह सेवा विफलता नहीं है। इसने मुझे विजुअल स्टूडियो के साथ वास्तव में इसे मारने के लिए मजबूर किया। कार्य प्रबंधक में सेवा प्रक्रिया पर राइट क्लिक करें। डीबग का चयन करें। विजुअल स्टूडियो में डीबग-> सभी को समाप्त करें का चयन करें। और अब आपने अनुकरण सेवा विफल कर दी है। इस मामले में वसूली तर्क ठीक काम करता है।

0

सेवा नियंत्रण प्रबंधक आपकी सेवा को पुनरारंभ करने का प्रयास करेगा यदि आपने इसे एससीएम द्वारा पुनरारंभ करने के लिए सेट अप किया है। यह SERVICE_FAILURE_ACTIONS संरचना के लिए प्रलेखन में here विस्तृत है।

एक सेवा माना जाता है समय विफल हो सेवा नियंत्रक से SERVICE_STOPPED की स्थिति की रिपोर्ट करने के बिना समाप्त हो जाता है।

यह ठीक SERVICE_FAILURE_ACTIONS_FLAG संरचना के fFailureActionsOnNonCrashFailures ध्वज की स्थापना द्वारा नियोजित किया जा सकता, here देखें)। आप पुनर्प्राप्ति टैब पर "त्रुटियों के साथ रोकने के लिए क्रियाएं सक्षम करें" चेकबॉक्स को चेक करके सेवा सेटिंग एप्लेट से इस सेटिंग को सेट कर सकते हैं।

यदि यह सदस्य सही है और सेवा विफलता कार्रवाई के लिए कॉन्फ़िगर किया गया है, विफलता कार्यवाही को पंक्तिबद्ध कर रहे हैं सेवा प्रक्रिया SERVICE_STOPPED की स्थिति की रिपोर्ट करने के बिना समाप्त हो जाता है या अगर यह SERVICE_STOPPED राज्य लेकिन SERVICE_STATUS संरचना के dwWin32ExitCode सदस्य प्रवेश करती है ERROR_SUCCESS नहीं है (0)। यदि यह सदस्य गलत है और सेवा विफलता कार्रवाइयों को कॉन्फ़िगर कर चुकी है, तो विफलता कार्य केवल तभी पंक्तिबद्ध होते हैं जब सेवा SERVICE_STOPPED की स्थिति की रिपोर्ट किए बिना समाप्त हो जाती है।

तो, कैसे आप अपने सेवा संरचित है, कैसे आप अपने विफलता कार्यों और क्या आप अपने 'गंभीर त्रुटि' यह ExitProcess() या exit() कॉल करने के लिए पर्याप्त हो सकता है और एक गैर शून्य वापस आ सकते हैं जब आप ऐसा करेंगे कॉन्फ़िगर किया है पर निर्भर करता है मूल्य। हालांकि, यह सुनिश्चित करना संभवतः सुरक्षित है कि आपकी सेवा एससीएम से निपटने वाले कोड के बिना निकलती है जो एससीएम को बताती है कि आपकी सेवा SERVICE_STOPPED राज्य तक पहुंच गई है। यह सुनिश्चित करता है कि आपकी विफलता कार्रवाइयां हमेशा होती हैं ...

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