2011-08-10 13 views
16

मुझे सी # के साथ बनाए गए विंडोज सेवा में टाइमआउट के कारण को निर्धारित करने में कठिनाई हो रही है। मैंने इस मुद्दे पर कई पदों और विषयों को देखकर काफी समय बिताया है, लेकिन मुझे यकीन नहीं है कि और क्या प्रयास करना है।सी # स्टार्टअप पर विंडोज सर्विस टाइमआउट

समस्या क्या है?

कभी-कभी मेरी विंडोज़ सेवा चलाने वाली कुछ मशीनों पर, मशीन को रीबूट करने के बाद सफलतापूर्वक शुरू नहीं होता है। मुझे समय-समय पर शुरू होने में विफल होने वाली सेवा के बारे में सामान्य EventLog संदेश प्राप्त होते हैं और यह 30000 मिलीसेकंड के बाद समाप्त हो जाता है। विंडोज सर्वर 2003 मशीनें सबसे आम पैटर्न प्रतीत होती हैं लेकिन यह हमेशा इस ओएस के लिए अलग नहीं होती है। उदाहरण के लिए यह अन्य W2K3 मशीनों पर पूरी तरह से ठीक काम करता है।

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

अन्य विवरण:

  1. Windows सेवा सी # में लिखा और नेट 2.0
  2. मेरी सेवा के लिए कोई अन्य सेवा निर्भरता जब स्थापित कर रहे हैं का उपयोग करता है।
  3. सेवा exe कोई रिलीज या प्रमाणीकरण हस्ताक्षर के साथ रिलीज बिल्ड है।
  4. ऑनस्टार्ट विधि थ्रेड और थ्रेड शुरू करके जितनी जल्दी हो सके निष्पादित करता है। ऑनस्टार्ट के भीतर कोई अन्य प्रारंभिक नहीं होता है।
  5. जब सेवा वास्तव में शुरू करने में असफल होती है, तो सेवाओं को सूची खोलना और इसे मैन्युअल रूप से मैन्युअल रूप से काम करना शुरू करना और सेवा शायद एक सेकंड से भी कम समय में शुरू होती है।

मेरे पास मेरे प्रोग्राम.c में निम्न कोड जोड़ा गया है जिसमें सेवा के लिए मुख्य प्रवेश बिंदु शामिल है। मैं CurrentDomain पर एक UnhandledException ईवेंट में हुक करता हूं और किसी भी अनचाहे त्रुटियों को लॉग इन करने के लिए log4net का उपयोग कर रहा हूं सर्विसबेस के चारों ओर एक कोशिश/पकड़ भी है। किसी भी तरह से यह किसी भी तरह से बम आउट हो जाता है ताकि मैं उस त्रुटि को लॉग कर सकूं।

protected override void OnStart(string[] args) 
{ 
    Thread serviceThread = new Thread(new ThreadStart(BackgroundStart)); 
    serviceThread.IsBackground = true; 
    serviceThread.Start(); 
} 

private void BackgroundStart() 
{ 
    //Initialize and start worker objects to perform monitoring... 
    //<Snip> 
} 

मेरे log4net कार्यान्वयन एक ConsoleAppender और एक RollingFileAppender जहां इसके विन्यास विवरण App.config में जमा हो जाती उपयोग कर रहा है:

static void Main() 
{ 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] 
    { 
     new SchedulerService() 
    }; 

    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

    try 
    { 
     ServiceBase.Run(ServicesToRun); 
    } 
    catch (Exception ex) 
    { 
     Log.Fatal("Unhandled Service Exception", ex); 
    } 
} 

private static log4net.ILog _log = null; 
static log4net.ILog Log 
{ 
    get 
    { 
     if (_log == null) 
     { 
      if (!log4net.LogManager.GetRepository().Configured) 
      { 
       log4net.Config.XmlConfigurator.Configure(); 
      } 

      _log = log4net.LogManager.GetLogger(typeof(Program)); 
     } 
     return _log; 
    } 
} 

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    Exception ex = e.ExceptionObject as Exception; 
    if (ex == null) ex = new Exception(e.ExceptionObject.ToString()); 

    Log.Fatal("Unhandled Service Exception", ex); 
} 

कोड मेरी विरासत में मिला ServiceBase कार्यान्वयन में इस प्रकार है।

इस चरण में मुझे यकीन नहीं है कि और क्या प्रयास करना है। यदि कोई और विवरण आवश्यक है तो मुझे बताएं।

धन्यवाद।

अद्यतन: बस, हर कोई अद्यतन करने के लिए मैं ऐसे सीधे इवेंटलॉग करने में प्रवेश करके या कि अगर कारण है log4net के बजाय एक फ़ाइल को देखने के लिए के रूप में कुछ सुझाव आज़माएं लिए जा रहा हूँ। मैं gen.config में जेनरपूलर एविडिड्स को झूठी में सेट करने का भी प्रयास करूंगा। मैं इन चीजों का परीक्षण करने के लिए क्लाइंट के सर्वर तक पहुंचने के लिए बस एक उपयुक्त डाउनटाइम का इंतजार कर रहा हूं।

+0

क्या आपने सेवा कोड शुरू करने के बारे में जानने के लिए अपने कोड में डीबग स्टेटमेंट जोड़ने का प्रयास किया है? –

+0

आप संभवतः थोड़ी अधिक जानकारी प्राप्त करने के लिए log4net आंतरिक डिबगिंग को सक्षम करने का प्रयास भी कर सकते हैं: http://logging.apache.org/log4net/release/faq.html#How%20do%20I%20enable%20log4net%20internal%20debugging% 3 एफ –

+2

एक संभावना यह है कि आपका लॉगिंग ढांचा लटक रहा है और यह वास्तविक समस्या को छुपा रहा है, खासकर जब आप कहते हैं कि यह लटकने पर कुछ भी लॉग नहीं है। – alun

उत्तर

1

सामान्य रूप से, OnStart से पृष्ठभूमि धागे को बढ़ाने के लिए सही काम करना सही है।

समस्या निवारण उद्देश्यों के लिए, आप 10 से RequestAdditionalTime विधि को कॉल करके अपनी सेवा को और स्टार्टअप समय देने का प्रयास कर सकते हैं। साथ ही, आप यह जांचना चाहेंगे कि क्या Windows EventLog (लॉग "एप्लिकेशन" पर कोई संदेश लिखा गया है, स्रोत आपका सेवा नाम होना चाहिए)।

2

कुछ बातें की कोशिश करने के लिए:

  • लॉग जोड़ें संदेशों Main() के शीर्ष करने, ServiceBase.Run() से पहले, आदि मान लें कि आप एक लॉग फ़ाइल मिलता है, कैसे उन timestamps Windows ईवेंट लॉग से तुलना करते हैं?

  • नई परियोजना विज़ार्ड के साथ एक नई नई सेवा बनाएं और इसे उसी तरह तैनात करें। समस्या मशीनों पर, क्या यह भरोसेमंद शुरू होता है?

  • process monitor प्राप्त करें और सामान्य स्टार्टअप देखें। किसी भी अप्रत्याशित नेटवर्क या फ़ाइल I/O की तलाश करें।

  • सुनिश्चित करें कि आपका SchedulerService कन्स्ट्रक्टर में कोई काम नहीं करता है, और इसमें कोई स्थैतिक-प्रारंभिक निर्भरता नहीं है।

  • पहली विफलता पर पुनरारंभ करने के लिए रिकवरी विकल्प सेट करें। क्या यह भरोसेमंद काम करता है?

1

मुझे यह भी संदेह होगा कि log4net किसी भी तरह से लटक रहा है। हो सकता है कि ड्राइव जहां लॉग बनाया जाना है, तब तक तैयार नहीं है जब मशीन बूट हो रही है। क्या आपने अपनी सेवा में देरी शुरू करने की कोशिश की है?

enter image description here

+0

क्षमा करें, बस यह पता चला कि यह विकल्प केवल Vista और बाद में उपलब्ध है। लेकिन हो सकता है कि आप लॉगर के निर्माण को मुख्य विधि में स्थानांतरित करना चाहें और सेवा को तब तक शुरू कर दें जब तक कि लॉगर सफलतापूर्वक नहीं बनाया जा सके। –

0

के बाद से log4net (in their words) एक विश्वसनीय प्रवेश प्रणाली होने के लिए नहीं बनाया गया है, मैंने सोचा कि यह बिना क्रिया eventlog के अपवाद लिखने के लिए अच्छा अभ्यास (और साथ ही अपनी लॉग करने के लिए के रूप में) था, विशेष रूप से सेवाओं के साथ।

6

मैंने कॉन्फ़िगरेशन फ़ाइल में प्रकाशक सबूत पीढ़ी को बंद करके इसी तरह की समस्या तय की। सेवा में प्रामाणिक हस्ताक्षर भी नहीं था लेकिन निम्नलिखित पंक्ति को तुरंत उस मशीन पर जारी किया गया जहां इसे लगातार पुन: उत्पन्न किया गया है।

<runtime> 
    <generatePublisherEvidence enabled="false" /> 
</runtime> 

इसके अलावा this MSDN source में सिफारिश की:
"हम अनुशंसा करते हैं कि सेवाओं तत्व का उपयोग स्टार्टअप के प्रदर्शन में सुधार करने के लिए इस तत्व का उपयोग करना भी मदद कर सकता देरी है कि एक टाइम-आउट और सेवा स्टार्टअप के रद्द होने का कारण बन सकती से बचें।। "

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