स्थानीय कंप्यूटर पर विंडोज सेवा शुरू हुई और फिर त्रुटि बंद हो गई


104

आमतौर पर, मुझे यह त्रुटि मिलती है: (स्थानीय कंप्यूटर पर "सेवा का नाम" सेवा शुरू हुई और फिर बंद हो गई। कुछ सेवाएं अपने आप बंद हो जाती हैं यदि वे अन्य सेवा या कार्यक्रमों के उपयोग में नहीं होती हैं) जब मेरे कोड में कुछ गड़बड़ है, जैसे गैर-मौजूद ड्राइव पथ, आदि। विंडोज़ सेवा शुरू नहीं होगी।

मेरे पास एक विंडोज़ सेवा है जो फ़ोल्डर / फ़ाइलों का बैक अप लेती है, यदि यह आकार सीमा तक पहुंच गया है तो किसी स्थान पर। विवरण सभी एक्सएमएल कॉन्फ़िगरेशन द्वारा प्रदान किए जाते हैं जो विंडोज़ सेवा शुरू में पढ़ते हैं। मेरे पास एक अलग विंडोज़ फॉर्म है जिसमें एक बटन है जो ठीक उसी तरह से करता है जो मेरी विंडोज़ सेवा का ऑनस्टार्ट कर रहा है। अपनी विंडो सेवा में रखने से पहले मैं कोड डीबग करने के लिए अपने विंडोज़ रूपों का उपयोग करता हूं।

जब मैं अपने विंडोज़ फॉर्म शुरू करता हूँ। यह वही करता है जो इसे करने के लिए लगता है। जब मैंने अपना कोड विंडोज़ सर्विस ऑनस्टार्ट () विधि में डाला तो त्रुटि दिखाई दी।

यहाँ मेरा कोड है:

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";

    protected override void OnStart(string[] args)
    {
        if (File.Exists(backupConfig))
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            XmlTextReader reader = new XmlTextReader(backupConfig);

            XmlNodeType type;
            List<string> listFile = new List<string>();
            string fileWatch = "";

            //this loop is for reading XML elements and assigning to variables
            while (reader.Read())
            {
                type = reader.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader.Name == "File")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                    else if (reader.Name == "Folder")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                }
            }
            reader.Close();

            watcher.Path = fileWatch;
            watcher.Filter = "*.*";

            //this loop reads whether the service will watch a file/folder
            XmlTextReader reader1 = new XmlTextReader(backupConfig);
            while (reader1.Read())
            {
                type = reader1.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader1.Name == "File")
                    {
                        watcher.IncludeSubdirectories = false;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFile);
                    }
                    else if (reader1.Name == "Folder")
                    {
                        watcher.IncludeSubdirectories = true;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
                    }
                }
            }
            reader1.Close();

            watcher.EnableRaisingEvents = true;

        }
        else
        {
            StreamWriter sw = new StreamWriter(serviceStat, true);
            sw.WriteLine("File not found. Please start the Log Backup UI first.");
            sw.Close();
        }
    }

मुझे नहीं पता कि विंडोज़ सेवा क्या शुरू नहीं करती है, विंडोज़ फॉर्म सिम्युलेटर ने ठीक काम किया है। आखिर समस्या क्या लग रही है?

अद्यतन: कई परीक्षणों के बाद मैंने देखा है कि केवल एक फ़ोल्डर निर्देशिका (w / आउट फ़ाइल) का उपयोग करके, विंडोज़ सेवा काम नहीं करती है। जब मैंने एक विशिष्ट फ़ाइल (इसकी निर्देशिका सहित) के साथ फाइलवैक चर को प्रतिस्थापित किया, तो विंडोज़ सेवा शुरू हुई। जब मैंने इसे वापस फ़ोल्डर स्थान में बदल दिया, तो यह काम नहीं किया। मुझे लगता है कि फ़ोल्डर स्थानों एक filewatcher में काम नहीं करता है।

जब मैंने एक नई विंडोज़ सेवा बनाने की कोशिश की, जो एक फ़ोल्डर स्थान को देखता है, तो यह काम करता है .. हालांकि, जब मैंने अपनी मूल विंडोज़ सेवा में समान स्थान की कोशिश की, तो यह काम नहीं किया! मैं माइंडफ $ # * एड था! ऐसा लगता है कि मुझे एक नई विंडोज़ सेवा बनानी है और हर बार इंस्टॉलर का निर्माण करना है, मैं एक नया कोड / फ़ंक्शन देता हूं। इस तरह मैं ट्रैक कर सकता हूं जहां मुझे कोई त्रुटि मिलती है।

जवाबों:


202

यदि सेवा शुरू हो जाती है और उसी तरह रुक जाती है, तो इसका मतलब है कि आपका कोड एक अपवाद छोड़ दिया गया है। यह डिबग करना काफी मुश्किल है, लेकिन कुछ विकल्प हैं।

  1. विंडोज इवेंट व्यूअर से सलाह लें । आम तौर पर आप कंप्यूटर / सर्वर मैनेजर पर जाकर, फिर इवेंट व्यूअर -> विंडोज लॉग्स -> एप्लिकेशन पर जाकर प्राप्त कर सकते हैं । आप देख सकते हैं कि यहां अपवाद क्या है, जो मदद कर सकता है, लेकिन आपको स्टैक ट्रेस नहीं मिलता है।
  2. लाइब्रेरी क्लास प्रोजेक्ट में अपना प्रोग्राम लॉजिक निकालें। अब प्रोग्राम के दो अलग-अलग संस्करण बनाएं: एक कंसोल ऐप (डिबगिंग के लिए), और विंडोज़ सेवा। (यह प्रारंभिक प्रयास का एक सा है, लेकिन लंबे समय में बहुत सारे एंगस्ट को बचाता है।)
  3. क्या चल रहा है की एक बेहतर तस्वीर पाने के लिए अधिक कोशिश / पकड़ ब्लॉक और एप्लिकेशन को लॉगिंग जोड़ें।

10
विंडोज इवेंट व्यूअर ने पूर्ण स्टैक ट्रेस, बहुत सहायक उपकरण दिखाया।
तल्हा इमाम

37

यकीन नहीं कि यह मददगार होगा, लेकिन एक सेवा को डिबग करने के लिए आप हमेशा ऑनस्टार्ट विधि में निम्नलिखित का उपयोग कर सकते हैं:

protected override void OnStart(string[] args)
{
     System.Diagnostics.Debugger.Launch();
     ...
}

आप इस प्रक्रिया के लिए अपने दृश्य स्टूडियो संलग्न कर सकते हैं और बेहतर डिबग क्षमता है।

आशा है कि यह मददगार था, सौभाग्य


यह अब तक का सबसे अच्छा समाधान है (कम से कम मेरे लिए)। वीएस 2015 इस अच्छी तरह से संभालता है। मेरे लिए इसने JIT डिबगर के लिए UAC पुष्टिकरण संवाद को पॉप अप किया और फिर मुझे डीएस 2015 को डीबगर के रूप में चुनने दिया।
स्माइली

9

मुझे आपकी मौजूदा विंडोज़ सेवा को केवल अपने प्रोग्राम को निम्नलिखित के साथ बदलकर कंसोल में बदलना बहुत आसान लगता है । इस परिवर्तन के साथ आप दृश्य स्टूडियो में डिबगिंग या सामान्य रूप से निष्पादन योग्य चलाकर कार्यक्रम चला सकते हैं। लेकिन यह विंडोज़ सेवा के रूप में भी काम करेगा। मैंने इसके बारे में एक ब्लॉग पोस्ट भी बनाया

Program.cs

class Program
{
    static void Main()
    {
        var program = new YOUR_PROGRAM();
        if (Environment.UserInteractive)
        {
            program.Start();
        }
        else
        {
            ServiceBase.Run(new ServiceBase[]
            {
                program
            });
        }
    }
}

YOUR_PROGRAM.cs

[RunInstallerAttribute(true)]
public class YOUR_PROGRAM : ServiceBase
{
    public YOUR_PROGRAM()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        Start();
    }

    protected override void OnStop()
    {
        //Stop Logic Here
    }

    public void Start()
    {
        //Start Logic here
    }
}


2

EventLog.Log को "एप्लिकेशन" के रूप में सेट किया जाना चाहिए


मैं बस के रूप में यह वास्तव में मेरे लिए समस्या का समाधान
Savage

1

इस बीच, एक और कारण: गलती से .config फ़ाइल को हटा दिया गया जो एक ही त्रुटि संदेश दिखाई देता है:

"स्थानीय कंप्यूटर पर सेवा शुरू हो गई और फिर बंद हो गई। कुछ सेवाएं अपने आप बंद हो जाती हैं ..."


0

अपनी फ़ाइलों की प्रतिलिपि बनाने के लिए टाइमर और टिक ईवेंट का उपयोग करें।

सेवा शुरू करने पर, समय शुरू करें और समय में अंतराल निर्दिष्ट करें।

इसलिए सेवा चालू रहती है और फ़ाइलों को ontick कॉपी करें।

आशा है कि यह मदद करेगा।


0

आप इनिशियलाइज़ेशन को यूनिट टेस्ट करना चाहते हैं - लेकिन क्योंकि यह OnStartविधि में यह असंभव के पास है। मेरा सुझाव है कि इनिशियलाइज़ेशन कोड को एक अलग वर्ग में ले जाए ताकि इसे एक टेस्टर के रूप में जांचा जा सके या कम से कम दोबारा इस्तेमाल किया जा सके।

दूसरे में कुछ लॉगिंग ( Log4Net या समान का उपयोग करके ) जोड़ने के लिए और कुछ वर्बोज़ लॉगिंग को जोड़ने के लिए ताकि आप सीमा त्रुटियों के बारे में विवरण देख सकें। रनटाइम त्रुटियों के उदाहरण AccessViolationआदि होंगे, खासकर यदि आपकी सेवा कॉन्फ़िगर फ़ाइलों तक पहुंचने के लिए पर्याप्त विशेषाधिकार के बिना चल रही है।


0

खाता जो सेवा चला रहा है उसने D: -drive (वे उपयोगकर्ता-विशिष्ट हैं) मैप नहीं किया हो सकता है। निर्देशिका साझा करने का प्रयास करें, और अपने में पूर्ण UNC-path का उपयोग करें backupConfig

आपका watcherप्रकार FileSystemWatcherएक स्थानीय वैरिएबल है, और जब OnStartविधि की जाती है , तो यह गुंजाइश से बाहर है। आपको शायद एक उदाहरण या वर्ग चर के रूप में इसकी आवश्यकता है।


0

मैं उसी मुद्दे पर आया था। मेरी सेवा XMLS को अपलोड / प्राप्त कर रही है और ईवेंट लॉग में त्रुटियों को लिखती है।

जब मैं इवेंट लॉग में गया, तो मैंने उसे फ़िल्टर करने का प्रयास किया। इसने मुझे संकेत दिया कि इवेंट लॉग दूषित हो गया था।

मैंने इवेंट लॉग और सब ठीक कर दिया।


0

हमारे मामले में, Windows ईवेंट लॉग में कुछ भी नहीं जोड़ा गया था सिवाय लॉग के कि समस्याग्रस्त सेवा शुरू कर दी गई है और फिर बंद कर दी गई है।

यह पता चला है कि सेवा की CONFIG फ़ाइल अमान्य थी। अमान्य CONFIG फ़ाइल को ठीक करने से समस्या ठीक हो गई।

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