2012-09-21 14 views
8

हम अपने बक्से पर कुछ सेवाओं को मारने के लिए स्टॉप-सेवा cmdlet का उपयोग कर रहे हैं। अधिकांश समय यह बहुत अच्छा काम करता है, हालांकि हमारे पास एक या दो सेवाएं हैं (कौन नहीं?) जो कभी-कभी अच्छा नहीं खेलती हैं।स्टॉप-सेवा cmdlet टाइमआउट संभव है?

इस उदाहरण सवाल में सेवाओं में से एक को रोकने के राज्य में ही रहेगा, और cmdlet अधिक से अधिक सांत्वना के लिए बाहर इस कहते हैं:

[08:49:21]WARNING: Waiting for service 'MisbehavingService (MisbehavingService)' to finish 
[08:49:21]stopping... 
[08:49:23]WARNING: Waiting for service 'MisbehavingService (MisbehavingService)' to finish 
[08:49:23]stopping... 
[08:49:25]WARNING: Waiting for service 'MisbehavingService (MisbehavingService)' to finish 
[08:49:25]stopping... 

अंततः हम कार्य में सेवा को मारने के लिए है प्रबंधक, और हमारी स्क्रिप्ट तब जारी है।

क्या कोई निश्चित बिंदु के बाद स्टॉप-सेवा cmdlet छोड़ने या टाइमआउट करने का कोई तरीका है? मुझे लगता है कि हम बाद में जांच सकते हैं और यदि सेवा अभी भी चल रही है, तो अंतिम काट प्रदान करने के लिए हत्या-प्रक्रिया cmdlet का उपयोग करें।

उत्तर

3

स्टॉप-सेवा के लिए कोई टाइमआउट विकल्प नहीं है, लेकिन यदि निर्भर सेवाएं हैं, तो आपको -force का उपयोग करने की आवश्यकता हो सकती है।

सेवाएं प्रारंभ होने पर एक प्रतीक्षा संकेत (जो एक टाइमआउट निर्दिष्ट करती है) को परिभाषित कर सकती हैं, लेकिन समय-समय पर सेवा द्वारा नियंत्रित किया जाता है। कोई भी सेवा नियंत्रण अनुरोध (प्रारंभ, रोकें, रोकें, फिर से शुरू करें) सेवा नियंत्रण प्रबंधक (एससीएम) के माध्यम से जाएं और प्रत्येक सेवा के लिए प्रतीक्षा संकेत का सम्मान करेंगे। यदि प्रतीक्षा संकेत पार हो गया है, तो ऑपरेशन विफल हो जाएगा और एक त्रुटि लौटा दी जाएगी।

आप नौकरी के रूप में स्टॉप-सर्विस चलाने के लिए इनवॉक-कमांड का उपयोग कर सकते हैं और इसे समय-समय पर जांच सकते हैं। यदि यह पूरा नहीं हुआ है, तो आप प्रक्रिया को मारने और जारी रखने के लिए स्टॉप-प्रोसेस का उपयोग कर सकते हैं।

+0

धन्यवाद स्टीवन। मुझे लगता है कि इस चर्चा के नीचे विषय के बारे में कुछ अच्छी सलाह भी है। विशेष रूप से, पृष्ठ पर अंतिम पोस्टिंग: http://www.powershellcommunity.org/Forums/tabid/54/aft/5243/Default.aspx – larryq

+0

यह कुछ अच्छी चीजें भी है। –

7

हालांकि Stop-Service समय समाप्त पैरामीटर नहीं होता है, System.ServiceController वर्ग पर WaitForStatus विधि एक अधिभार कि समय समाप्त पैरामीटर (दस्तावेज here) लेता है। सौभाग्य से, यह बिल्कुल ऑब्जेक्ट का प्रकार है कि Get-Service कमांड रिटर्न देता है।

यहां एक साधारण कार्य है जो सेकंड में सेवा का नाम और टाइमआउट लेता है। यह समय $true देता है यदि सेवा टाइमआउट से पहले बंद हो जाती है, और कॉल समय समाप्त होने पर $false (या सेवा मौजूद नहीं है)।

function Stop-ServiceWithTimeout ([string] $name, [int] $timeoutSeconds) { 
    $timespan = New-Object -TypeName System.Timespan -ArgumentList 0,0,$timeoutSeconds 
    $svc = Get-Service -Name $name 
    if ($svc -eq $null) { return $false } 
    if ($svc.Status -eq [ServiceProcess.ServiceControllerStatus]::Stopped) { return $true } 
    $svc.Stop() 
    try { 
     $svc.WaitForStatus([ServiceProcess.ServiceControllerStatus]::Stopped, $timespan) 
    } 
    catch [ServiceProcess.TimeoutException] { 
     Write-Verbose "Timeout stopping service $($svc.Name)" 
     return $false 
    } 
    return $true 
} 
संबंधित मुद्दे