एक csharp-example और विधिवत के साथ शुरू सवाल (Restart a windows services from C# और Cannot restart a Service) और विभिन्न अन्य प्रश्न से संबंधित सिर्फ एक सेवा को पुन: प्रारंभ अतः संबंधित पर ध्यान देते हुए मैं सोच रहा हूँ के लिए क्या सबसे अच्छा तरीका है निर्भर सेवाएं के साथ एक सेवा को पुन: प्रारंभ (उदाहरण के लिए Message Queuing
, जिस पर Message Queuing Triggers
निर्भर करता है, या IIS
, जिस पर FTP Publishing
और World Wide Web Publishing
निर्भर करता है)। एमएमसी स्नैप-इन यह स्वचालित रूप से करता है, लेकिन कोड समान कार्यक्षमता प्रदान नहीं करता है (कम से कम आसानी से नहीं)।आश्रित सेवाओं के साथ एक सेवा पुनरारंभ करें?
MSDN documentation for Stop कहते हैं, "किसी भी सेवा के लिए अपने ऑपरेशन के लिए इस सेवा का उपयोग करते हैं तो वे बंद कर दिया जाएगा से पहले इस सेवा को बंद कर दिया गया है। DependentServices संपत्ति सेवाओं है कि इस पर निर्भर करती है की सेट होता है," और DependentServices
सेवाओं की एक सरणी देता है । मान लिया जाये कि StartService()
और StopService()
सम्मेलनों उदाहरण और में उल्लिखित निर्देशों का पालन इस तरह के ऊपर (सिवाय इसके कि वे ServiceControllers
और TimeSpans
स्वीकार सीधे), मैं के साथ शुरू किया संदर्भित:
public static void RestartServiceWithDependents(ServiceController service, TimeSpan timeout)
{
ServiceController[] dependentServices = service.DependentServices;
RestartService(service, timeout); // will stop dependent services, see note below* about timeout...
foreach (ServiceController dependentService in dependentServices)
{
StartService(dependentService, timeout);
}
}
लेकिन सेवा निर्भरता नेस्टेड रहते हैं क्या हुआ अगर (पुनरावर्ती) या चक्रीय (यदि यह भी संभव है ...) - अगर Service A
है Service B1
और Service B2
और Service C1
Service B1
पर निर्भर करता है के द्वारा पर निर्भर, ऐसा लगता है 'को पुन: प्रारंभ' इस विधि द्वारा Service A
बंद कर देंगे 210 लेकिन यह पुनः आरंभ नहीं होता ...
इस उदाहरण चित्र स्पष्ट बनाने के लिए, मैं सेवाओं एमएमसी में मॉडल का पालन करेंगे स्नैप-इन:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
वहाँ के बारे में जाने के लिए एक बेहतर तरीका है यह, या क्या इसे केवल प्रत्येक आश्रित सेवा में कदम उठाना और रोकना होगा और फिर मुख्य सेवा को पुनरारंभ करने के बाद उन सभी को पुनरारंभ करना होगा?
साथ ही, निर्भर लेकिन वर्तमान में बंद कर दिया जाएगा सेवाओं DependentServices के अंतर्गत सूचीबद्ध किया? यदि हां, तो क्या यह उन्हें फिर से शुरू नहीं करेगा? यदि हां, तो क्या हमें इसे भी नियंत्रित करना चाहिए? यह सिर्फ गड़बड़ और गड़बड़ हो रहा है ...
* नोट: मुझे एहसास है कि timeout
पूरी तरह से सही ढंग से लागू नहीं किया जा रहा है (समग्र टाइमआउट अपेक्षा से कई गुना अधिक हो सकता है), लेकिन अब यह मुद्दा नहीं है मुझे चिंता है - अगर आप इसे ठीक करना चाहते हैं, ठीक है, लेकिन केवल 'टाइमआउट टूटा हुआ नहीं है ...'
अपडेट: कुछ प्रारंभिक परीक्षण के बाद, मैंने (/ पुष्टि) की खोज की है निम्नलिखित व्यवहार:
- सेवा रोकना (उदाहरण के लिए
Service A
) कि अन्य सेवाएं (ई .g।Service B1
) पर निर्भर अन्य सेवाओं ("नेस्टेड" इस तरह केService C1
रूप निर्भरता) DependentServices
(चल रहा है, रूका, आदि) सभी राज्यों में निर्भर सेवाओं में शामिल करता है सहित बंद हो जाएगा, और यह भी नेस्टेड निर्भरता है, यानी शामिलService_A.DependentServices
में{Service B1, Service C1, Service B2}
होगा (उस क्रम में,C1
B1
पर निर्भर करता है)।- किसी सेवा को शुरू करना जो दूसरों पर निर्भर करता है (उदा।
Service B1
Service A
पर निर्भर करता है) आवश्यक सेवाओं को भी शुरू करेगा।
कोड ऊपर इसलिए सरल किया जा सकता (कम से कम आंशिक रूप से) सिर्फ मुख्य सेवा (जो सभी निर्भर सेवाएं बंद हो जाएगा) और फिर बंद करने के लिए सबसे निर्भर सेवाओं (जैसे Service C1
और Service B2
) को पुन: प्रारंभ (या बस "सभी" निर्भर सेवाओं को पुनरारंभ करना - यह पहले से शुरू किए गए लोगों को छोड़ देगा), लेकिन यह वास्तव में केवल तब तक मुख्य सेवा की शुरुआत को रोकता है जब तक निर्भरताओं में से कोई इसकी शिकायत नहीं करता है, जिससे वास्तव में मदद नहीं मिलती है।
सिर्फ सबसे आसान तरीका सभी निर्भरता को पुन: प्रारंभ कर रहा है की तरह अब के लिए लग रहा है, लेकिन वह (अब के लिए) पर ध्यान नहीं देता सेवाओं है कि पहले से ही कर रहे हैं प्रबंध बंद कर दिया और इस तरह के ...