पुनरारंभ करने के लिए पुनर्प्राप्ति कार्रवाई के साथ Windows सेवा स्थापित करें


88

मैं ServiceProcessInstallerऔर ServiceInstallerवर्गों का उपयोग करके एक Windows सेवा स्थापित कर रहा हूं ।

मैंने ServiceProcessInstallerस्टार्ट टाइप, नाम आदि को सेट करने के लिए उपयोग किया है , लेकिन मैं रिस्टार्ट को रिकवरी एक्शन कैसे सेट कर सकता हूं?

मुझे पता है कि सेवा प्रबंधन कंसोल पर जाने और सेवा के गुणों की पुनर्प्राप्ति टैब पर सेटिंग्स को बदलने के बाद सेवा स्थापित होने के बाद मैं इसे मैन्युअल रूप से कर सकता हूं, लेकिन क्या इंस्टॉल के दौरान ऐसा करने का कोई तरीका है?

सेवा संपत्ति वसूली टैब

जवाबों:


99

आप sc का उपयोग करके पुनर्प्राप्ति विकल्प सेट कर सकते हैं । निम्नलिखित विफलता के बाद सेवा को फिर से शुरू करने के लिए निर्धारित करेगा:

sc failure [servicename] reset= 0 actions= restart/60000

इसे आसानी से C # से पुकारा जा सकता है:

static void SetRecoveryOptions(string serviceName)
{
    int exitCode;
    using (var process = new Process())
    {
        var startInfo = process.StartInfo;
        startInfo.FileName = "sc";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        // tell Windows that the service should restart if it fails
        startInfo.Arguments = string.Format("failure \"{0}\" reset= 0 actions= restart/60000", serviceName);

        process.Start();
        process.WaitForExit();

        exitCode = process.ExitCode;
    }

    if (exitCode != 0)
        throw new InvalidOperationException();
}

4
ध्यान दें कि आपको उद्धरण चिह्नों में सेवा का नाम शामिल करने की आवश्यकता है, यदि इसमें रिक्त स्थान हैं।
user626528

19
यदि आप इंस्टॉलर [] सेवा से हैंडलर को C # में कॉल करने जा रहे हैं, तो सेवा स्थापित होने पर, आप इस कॉल को "कमिटेड" ईवेंट हैंडलर में डाल सकते हैं, जो सेवा नियंत्रण प्रबंधक में सेवा के प्रकट होने के ठीक बाद इसे निष्पादित करेगा। इसे "आफ्टरस्टॉल" ईवेंट मैनेजर में मत डालें, क्योंकि यह पहली बार सेवा बॉक्स पर स्थापित होने पर काम नहीं करेगा।
कंटैंगो

@ केविन विजुअल स्टूडियो के कोड विश्लेषण से पता चलता है कि वस्तुओं को एक से अधिक बार निपटाया नहीं जाना चाहिए, process.Close()लाइन बेकार है।
JohnTube

1
@ JohnTube - प्रक्रिया को हटा दिया। क्लोज़ () लाइन
केविन

23
ध्यान दें कि वाक्यविन्यास कुछ अजीब लग सकता reset= 0है, लेकिन सही है, और reset=0गलत है। रिक्त स्थान का सही उपयोग महत्वपूर्ण है, reset=एक तर्क है, उसके बाद एक स्थान है 0
लियाम

12

कई अटैक्स के बाद, मैंने sc कमांड लाइन ऐप का उपयोग करके इसे हल किया ।

मेरे पास installutil और sc के साथ बैच फ़ाइल है। मेरा बैच फ़ाइल के समान है:

installutil.exe "path to your service.exe"
sc failure "your service name" reset= 300 command= "some exe file to execute" actions= restart/20000/run/1000/reboot/1000

यदि आप sc कमांड का पूर्ण प्रलेखन चाहते हैं, तो इस लिंक का पालन करें: SC.exe: सेवा नियंत्रक और स्थापित सेवाओं के साथ संचार करता है

नोट: आपको प्रत्येक बराबर (=) प्रतीक के बाद एक स्थान जोड़ना होगा। उदाहरण: रीसेट = 300


9

2

मुझे निम्नलिखित परियोजना मिली जो केवल कोड और विन एपीआई कॉल का उपयोग करके इन सेटिंग्स का ध्यान रखती है:
http://code.msdn.microsoft.com/windowsdesktop/CSWindowsServiceRecoveryPro-2147e7ac


आपका लिंक टूट गया है! लिंक केवल उत्तर खराब हैं!
आआआ

लिंक काम करता है और यह सबसे अच्छा समाधान है। एक प्रक्रिया शुरू किए बिना काम करता है।
पीडोन नोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.