2014-09-03 3 views
1

Я пытаюсь написать более надежный командлет Stop-Service (PSv3). В основном, имея функцию, которая вызывает Stop-Service, затем проверяет статус службы, чтобы увидеть, что служба действительно остановлена ​​и, в конечном счете, перейдет в процесс, убивающий службу.Не отвечающий сервис для тестирования обработки обслуживания

Я пытаюсь написать или найти службу, которая не прекращается изящно, но имеет тенденцию задерживаться после получения уведомления о прекращении.

Мой 'плохой' сервис просто использует это:

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

Но служба делает остановки в любой тайм-аут позволяет Stop-Service.

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 

я действительно ожидал (и в этом случае требуется) командлет Stop-Service, чтобы вернуть сообщение о том, сервис не удалось остановить в отведенное время.

Кажется, я вижу, похож на ожидаемое поведение, когда услуга имеет зависимости:

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

+0

я получил его, так что сервис Безразлично 't stop, и, как показывает ответ в комментарии выше, Stop-Service не ev тайм-аут, он будет продолжать писать: ПРЕДУПРЕЖДЕНИЕ: Ожидание обслуживания «Trogdor (StrongBad)», чтобы остановить ... – Arluin

ответ

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 
Смежные вопросы