2012-09-21 13 views
8

Kutularımızda birkaç hizmeti durdurmak için stop-service cmdlet'ini kullanıyoruz. Çoğu zaman harika çalışıyor, ancak ara sıra güzel oynamayan bir ya da iki hizmetimiz var.stop-service cmdlet zaman aşımı mümkün mü?

söz konusu hizmetlerin bir durdurma durumunda kalacaktır Bu durumda

ve cmdlet'in defalarca konsola dışarı bu koyar:

[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... 

Sonunda görevi hizmet öldürmek zorunda yöneticisi ve scriptimiz devam ediyor.

durak hizmeti cmdlet belirli bir noktadan sonra yukarı veya zaman aşımı vermek için bir yolu var mı? Sonrasında kontrol edebileceğimizi ve hizmetin hala devam edip etmediğini anlayabiliyorum, son bir parçalama sağlamak için kill-process cmdlet'ini kullanın.

cevap

3

durak hizmet için herhangi bir zaman aşımı seçeneği yoktur, ancak bağımlı hizmetler varsa, sen -force kullanması gerekebilir.

Hizmetler başladıklarında (bir zaman aşımı belirtir) bir bekleme ipucu tanımlayabilirsiniz ancak zaman aşımı hizmeti tarafından kontrol edilir. Servis kontrol talepleri (başlatma, durdurma, duraklatma, devam) servis kontrol yöneticisinden (SCM) geçer ve her servis için bekleme ipuçlarına saygı gösterecektir. Bekleme ipucu aşılırsa, işlem başarısız olur ve bir hata döndürür.

Bir iş olarak Durdur-Service çalıştırmak ve periyodik olarak kontrol etmek çağırmak-komutunu kullanabilirsiniz. Tamamlamadıysa işlemi durdurmak ve devam etmek için Stop-Process'i kullanabilirsiniz. Stop-Service rağmen

+0

Teşekkürler Steven. Aşağıda bu tartışmanın konuyla ilgili bazı iyi tavsiyelerde bulunduğunu düşünüyorum. Özellikle, sayfadaki son gönderme: http://www.powershellcommunity.org/Forums/tabid/54/aft/5243/Default.aspx – larryq

+0

Bu da bazı güzel şeyler. –

7

bir zaman aşımı parametresi yoktur, System.ServiceController sınıf WaitForStatus yöntem bir zaman aşımı parametresinin (here belgelenen) alır bir aşırı var. Neyse ki, bu tam olarak Get-Service komutunun döndürdüğü nesnenin türüdür.

Burada, bir hizmet adını ve bir süreyi saniye cinsinden alan basit bir işlev var. Zaman aşımına ulaşılmadan önce hizmet durduğunda $true döndürür ve çağrı zaman aşımına uğradığında (veya hizmet mevcut değilse) $false. Eğer Powershell 5.1 varsa

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 
}