2010-05-20 8 views
21

मैं विंडोज सेवा को रोकने के लिए बैच फ़ाइल का उपयोग कर रहा हूं। मैं sc कमांड का उपयोग कर रहा हूं, लेकिन नीचे दिए गए प्रश्न को देखते हुए मैं अन्य विचारों के लिए खुला हूं। (- स्टॉप के लिए इंतजार नहीं करयह होता है sc को stop तर्क केवल अनुरोध बंद करने लगता है) समस्या यह है कि बैच फ़ाइल आगे बढ़ता है, जबकि सेवा रोक रहा है है।सेवा बंद होने तक होल्ट बैच फ़ाइल पूर्ण हो गई है?

मैं को बैच फ़ाइल को कैसे संशोधित आगे नहीं जब तक रोक पूरा है सकते हैं?

उत्तर

25

उपयोग NET stop का उपयोग कर सकते हैं, जो सिंक्रोनस है, यानी यह सेवा बंद होने तक प्रतीक्षा करेगा।

देखें - NET stop

+1

हालांकि 'शुद्ध stop' एक सामान्य त्रुटि कोड 2 (पहुँच से मना कर) फेंक देते हैं। – Wernight

+27

यह पूरी तरह से सही नहीं है। यदि सेवा लेती है, तो वास्तव में पूरी तरह से रुकने और बाहर निकलने के लिए 4 मिनट कहें, "नेट स्टॉप" कमांड 20-40 सेकंड के बाद वापस आ जाएगा, लेकिन सेवा प्रक्रिया अभी तक समाप्त नहीं हुई है। यह लौटाता है "सेवा बंद नहीं की जा सकती" ... लेकिन यह भ्रामक है। सेवा को स्टॉप कमांड भेजा गया है, लेकिन एससीएम टाइमआउट के भीतर बस बाहर नहीं निकला है। – Jonesome

2

मेरा मानना ​​है कि जब तक सेवा पूरी तरह से पर जाने से पहले बंद कर दिया है net stop [Service] इंतजार करना चाहिए। sc stop [Service] बस सेवा के लिए एक "स्टॉप" संदेश भेजता है।

+1

पूरी तरह से सही नहीं है। कृपया ऊपर मेरी टिप्पणी देखें। – Jonesome

+0

@ जोन्सोम - डाउनवॉटिंग के बजाय, बेहतर जवाब क्यों न दें? – LittleBobbyTables

+0

उचित कॉल! किया हुआ! डाउनवोट का कारण यह है कि दोनों उत्तरों में गलत जानकारी होती है (मैंने Win7 और win2008 पर परीक्षण किया है, और अनुभव से पता है कि XP ​​और अन्य बनाम वही व्यवहार करेंगे)। – Jonesome

11

जैसा ऊपर बताया गया है, नेट स्टॉप सेवा के लिए एक स्टॉप कमांड भेज देगा, लेकिन, यदि सेवा एक निश्चित समय से अधिक लेती है (20 सेकंड या तो मेरा अवलोकन है), नेट स्टॉप वास्तव में सेवा की प्रतीक्षा नहीं करेगा लौटने से पहले रुकें।

वास्तव में बैच फ़ाइल को थामने जब तक सेवा बंद हो जाता है, तो आप इन धागे में उल्लिखित उन जैसे एक दृष्टिकोण उपयोग करने की आवश्यकता करने के लिए:

How to check if a service is running via batch file and start it, if it is not running?

Stopping/Starting a remote Windows service and waiting for it to open/close

+0

डाउनवॉटर नहीं (हालांकि मुझे लगता है कि कौन था), लेकिन यह जवाब * भी * गलत जानकारी है। 'नेट स्टॉप' * एक बिंदु तक, सेवा को रोकने के लिए प्रतीक्षा करेगा *। मैंने कभी भी पूरे चार मिनट तक रोकने की कोशिश नहीं की है, इसलिए मैं यह नहीं कह सकता कि 'नेट स्टॉप' कितनी देर तक इंतजार कर रहा है, लेकिन यह * स्कैन स्टॉप 'के विपरीत, एक सभ्य अवधि का इंतजार करता है। \ – LittleBobbyTables

+0

@LittleBobbyTables पोस्ट को आपके द्वारा देखी जाने वाली चीज़ों के लिए अपडेट किया गया है। यदि आप देखते हैं कि माइक्रोसॉफ्ट टीम क्या लिखती है (नीचे लिंक), तो आप देखेंगे कि एससीएम केवल एक ही समय में एक सेवा से बात करता है, इसलिए यह किसी भी सेवा के लिए हमेशा के लिए इंतजार नहीं करेगा। एनईटी भेजें एससीएम को सीएमडी भेजने का एक तरीका है, जैसा कि सर्विस मैनेजर में है। http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx – Jonesome

+0

@ जोन्सोम द्वारा लिंक किए गए ब्लॉग से थोड़ी अधिक जानकारी खींचकर: टाइमआउट को नियंत्रित करने वाली रजिस्ट्री कुंजी 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout' है। डिफ़ॉल्ट रूप से 20 सेकंड है, लेकिन मेरे विंडोज 8.1 एंटरप्राइज़ बॉक्स (संभावित रूप से समूह नीति द्वारा बदला गया) पर 5 सेकंड है। – Stajs

1

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

नेट रोकें [सेवा]

: TRYAGAIN

TIMEOUT/टी 10/NOBREAK

नेट स्टार्ट [सेवा]

यदि% errorlevel% NEQ 0 गोटो TRYAGAIN

मुझे इस कोड स्निपेट के साथ एहसास है कि अगर सेवा सफलतापूर्वक शुरू नहीं हुई है तो इसका परिणाम अंतहीन पाश हो सकता है। मैं बस मूल रूप से यह देखना चाहता था कि TIMEOUT का उपयोग करके इस मुद्दे को कैसे प्राप्त किया जाए, जहां नेट स्टॉप कमांड की अनुमति के मुकाबले एक सेवा को रोकने में अधिक समय लग सकता है।

8
sc stop webdriveservice 
:loop 
sc query webdriveservice | find "STOPPED" 
if errorlevel 1 (
    timeout 1 
    goto loop 
) 
0

आदेशों के बीच && प्रतीक का उपयोग करें। && प्रतीक अगले कमांड पर जाने से पहले पिछले कमांड को समाप्त करने के लिए इंतजार कर रहा है।

सभी आदेश एक ही कमांड पंक्ति पर होना चाहिए। आप एक पंक्ति में जितनी चाहें उतनी कमांड का उपयोग कर सकते हैं।

आप pause कमांड का भी उपयोग कर सकते हैं। इसके साथ, अगली प्रक्रिया पर जाने से पहले, किसी भी कुंजी को दबाए जाने के लिए कहा जाता है।

उदाहरण के लिए: अगर सेवा पहले से ही बंद कर दिया है

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo   [ "MyServiceName" service stopped ] && echo. && pause 
संबंधित मुद्दे