2014-09-03 68 views
1

我正在嘗試編寫更強大的Stop-Service cmdlet(PSv3)。基本上有一個調用Stop-Service的函數,然後測試服務狀態,看看服務是否真的停止,並最終升級到服務的進程終止。服務處理測試的無響應服務

我試圖寫或找到一個服務不會優雅地停止,但往往會在收到停止通知後徘徊。

我的「壞」的服務只是利用這個:

protected override void OnStop() 
    { 
     TheEventLog.WriteEntry("StrongBad in OnStop"); 
     Thread.Sleep(300000); 
    } 

但服務不中任何超時停止-服務允許停止。

PS C:\WINDOWS\system32> Stop-Service -Name StrongBad 
WARNING: Waiting for service 'Trogdor (StrongBad)' to stop... 
WARNING: Waiting for service 'Trogdor (StrongBad)' to stop... 
WARNING: Waiting for service 'Trogdor (StrongBad)' to stop... 
WARNING: Waiting for service 'Trogdor (StrongBad)' to stop... 
PS C:\WINDOWS\system32> Get-Service StrongBad 

Status Name    DisplayName 
------ ----    ----------- 
Stopped StrongBad   Trogdor 

真料(在這種情況下要)的停止服務cmdlet可以返回一個消息,說該服務沒有停止在規定的時間。

我似乎看到類似預期的行爲時,服務有依存關係:

PS C:\src\Enterprise\Enterprise\Systems\Scripts\Powershell\Includes> Stop-Service -Name nsi -Force 
Stop-Service : Service 'Network Store Interface Service (nsi)' cannot be stopped due to the following error: Cannot stop LanmanWorkstation service on computer '.'. 
At line:1 char:1 
+ Stop-Service -Name nsi -Force 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : CloseError: (System.ServiceProcess.ServiceController:ServiceController) [Stop-Service], ServiceCommandException 
    + FullyQualifiedErrorId : CouldNotStopService,Microsoft.PowerShell.Commands.StopServiceCommand 

Stop-Service : Collection was modified; enumeration operation may not execute. 
At line:1 char:1 
+ Stop-Service -Name nsi -Force 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Stop-Service], InvalidOperationException 
    + FullyQualifiedErrorId : System.InvalidOperationException,Microsoft.PowerShell.Commands.StopServiceCommand 
+0

這裏有一個相關的答案:http://stackoverflow.com/questions/12534170/stop-service-cmdlet-timeout-possible – Arluin 2014-09-03 21:14:31

+0

我得到了它,因此沒有按服務不要停下來,正如上面評論中的答案所表明的那樣,停止服務不會發生真正超時,它會繼續寫:警告:等待服務'Trogdor(StrongBad)'停止... – Arluin 2014-09-03 22:43:28

回答

1

有沒有辦法讓Stop-Service超時。它會很樂意等待服務停下來(問我怎麼知道的)。每this answer,則需要啓動一個後臺作業停止服務,等待,直到它完成,如果服務沒有停止,殺死它:

Start-Job { Stop-Service StrongBad } | Wait-Job -Timeout 30 
$svc = Get-Service StrongBad 
if($svc.Status -ne 'Stopped') 
{ 
    # This assumes the process name is strongbad 
    Stop-Process StrongBad 
} 
0

這的確是一個問題的兩個部分。第一部分是我如何編寫一個不會立即關閉的服務,以便測試我更強大的停止服務。

這個問題的答案一半的問題是,我需要在服務設置WaitHint停車時:

 serviceStatus.dwCurrentState = ServiceState.SERVICE_STOP_PENDING; 
     serviceStatus.dwWaitHint = 100000; 
     SetServiceStatus(this.ServiceHandle, ref serviceStatus); 

我怎麼做一站式服務更加堅固的問題的後半部分是什麼@Aaron說,但我全身更是:

$sb = [scriptblock]::Create("Stop-Service $ServiceName") 
$jobid = Start-Job $sb | Wait-Job -Timeout $Timeout