2012-09-21 2 views
8

우리는 stop-service cmdlet을 사용하여 상자에서 몇 가지 서비스를 중지합니다. 대개의 경우 훌륭하게 작동하지만 때로는 좋지 않은 서비스가 하나 또는 두 개 있습니다 (누가하지 않습니까?).stop-service 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... 

은 결국 우리가 작업의 서비스를 죽여야 관리자 및 스크립트가 계속됩니다.

특정 시점 이후에 stop-service cmdlet을 포기하거나 시간 초과 할 수있는 방법이 있습니까? 나중에 확인할 수 있고 서비스가 계속 실행 중인지 확인하려면 kill-process cmdlet을 사용하여 최종 잘라 내기를 제공하십시오.

답변

3

중지 서비스에 대한 시간 초과 옵션은 없지만 종속 서비스가있는 경우 -force를 사용해야 할 수 있습니다.

서비스는 시작될 때 대기 힌트 (시간 초과를 지정 함)를 정의 할 수 있지만 시간 제한은 서비스에서 제어합니다. 모든 서비스 제어 요청 (시작, 중지, 일시 중지, 다시 시작)은 서비스 제어 관리자 (SCM)를 통해 진행되며 각 서비스에 대한 대기 힌트를 고려합니다. 대기 힌트를 초과하면 작업이 실패하고 오류가 반환됩니다.

invoke-command를 사용하여 Stop-Service를 작업으로 실행하고 주기적으로 점검 할 수 있습니다. 완료되지 않은 경우 Stop-Process를 사용하여 프로세스를 종료하고 계속 진행할 수 있습니다. 비록 Stop-Service

+0

감사합니다. Steven. 나는 아래의이 토론이 주제에 관해 좋은 조언을하고 있다고 생각한다. 특히, 페이지의 마지막 게시 : http://www.powershellcommunity.org/Forums/tabid/54/aft/5243/Default.aspx – larryq

+0

그건 좋은 물건입니다. –

7

타임 아웃 파라미터가없는 상기 System.ServiceController 클래스에 WaitForStatus 방법은 타임 아웃 파라미터 (here 문서화) 걸리는 과부하를 가지고있다. 다행히도 이것은 정확히 Get-Service 명령이 반환하는 객체 유형입니다.

다음은 서비스 이름과 시간 초과를 초 단위로 취하는 간단한 함수입니다. 제한 시간에 도달하기 전에 서비스가 중지되면 $true을 반환하고 호출 시간이 초과되면 (또는 서비스가없는 경우) $false을 반환합니다. 당신이 PowerShell을 5.1이있는 경우

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 
}