2012-09-21 9 views
8

私たちは、stop-serviceコマンドレットを使用して、ボックスのいくつかのサービスを停止しています。ほとんどの場合、それは素晴らしい作品ですが、私たちは1つか2つのサービスを持っています(誰がいないのですか?)。stop-serviceコマンドレットのタイムアウトは可能ですか?

問題となっているサービスの一つが停止状態のままになります。この例では

、およびコマンドレットは何度もコンソールにこれを置く:

[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コマンドレットをあきらめたりタイムアウトさせる方法はありますか?後で確認でき、サービスがまだ実行されている場合は、kill-processコマンドレットを使用して最終的なチョップを提供します。

答えて

3

停止サービスのタイムアウトオプションはありませんが、依存サービスがある場合は、-forceを使用する必要があります。

サービスは開始時に待機ヒント(タイムアウトを指定)を定義できますが、タイムアウトはサービスによって制御されます。すべてのサービス制御要求(開始、停止、一時停止、再開)はサービス制御マネージャ(SCM)を通過し、各サービスの待機ヒントを尊重します。待機ヒントを超えた場合、操作は失敗し、エラーが返されます。

invoke-commandを使用して、Stop-Serviceをジョブとして実行し、定期的にチェックすることができます。完了していない場合は、Stop-Processを使用してプロセスを終了し、続行できます。

+0

ありがとうSteven。私は、以下のこの議論もまた、その主題に関するいくつかの良いアドバイスを持っていると思う。特に、ページの最後の投稿: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 
} 
関連する問題