Powershell等待服务停止或启动

时间:2015-01-28 07:33:55

标签: powershell

我搜索了这个论坛并通过谷歌找不到我需要的东西。 我有一个非常大的脚本,我正在寻找一些代码来检查服务是否已启动或停止,然后再继续下一步。

它自己需要循环的功能,直到它停止或启动(转到具有Stopped功能和启动功能)。

总共4个服务几乎具有相同的名称,因此Service Bus *可以用作通配符。

5 个答案:

答案 0 :(得分:32)

我无法计算'' Micky发布的战略,工作,所以这就是我如何解决它:

我创建了一个函数,它接受一个searchString(这可能是" Service Bus *")以及我期望服务应该达到的状态。

function WaitUntilServices($searchString, $status)
{
    # Get all services where DisplayName matches $searchString and loop through each of them.
    foreach($service in (Get-Service -DisplayName $searchString))
    {
        # Wait for the service to reach the $status or a maximum of 30 seconds
        $service.WaitForStatus($status, '00:00:30')
    }
}

现在可以使用

调用该函数
WaitUntilServices "Service Bus *" "Stopped"

WaitUntilServices "Service Bus *" "Running"

如果达到超时时间,则抛出一个不那么优雅的异常:

Exception calling "WaitForStatus" with "2" argument(s): "Time out has expired and the operation has not been completed."

答案 1 :(得分:10)

以下将循环并验证给定服务的状态,直到具有"运行"的服务数量为止。 state等于零(因此它们被停止),所以如果你正在等待服务停止,你可以使用它。

我添加了$MaxRepeat变量,这将阻止它永远运行。它将按照定义运行20次。

$services = "Service Bus *"
$maxRepeat = 20
$status = "Running" # change to Stopped if you want to wait for services to start

do 
{
    $count = (Get-Service $services | ? {$_.status -eq $status}).count
    $maxRepeat--
    sleep -Milliseconds 600
} until ($count -eq 0 -or $maxRepeat -eq 0)

答案 2 :(得分:3)

除了answer of mgarde之外,如果您只想等待一项服务(也受post from Shay Levy的启发),则此衬纸可能会有用:

*ngFor

答案 3 :(得分:0)

我不得不对多个计数器进行一些微调,因为该服务故意启动和停止很慢。原始脚本使我走上了正轨。我必须等待服务完全停止后才能继续操作,因为我实际上是在重新启动该服务。 您可能可以删除“睡眠”,但是我不介意将其保留。 您可能可以删除所有内容,而只需使用$ stopped变量。 :)

    # change to Stopped if you want to wait for services to start
    $running = "Running" 
    $stopPending = "StopPending"
    $stopped = "Stopped"
    do 
    {
        $count1 = (Get-Service $service | ? {$_.status -eq $running}).count
        sleep -Milliseconds 600
        $count2 = (Get-Service $service | ? {$_.status -eq $stopPending}).count
        sleep -Milliseconds 600
        $count3 = (Get-Service $service | ? {$_.status -eq $stopped}).count
        sleep -Milliseconds 600
    } until ($count1 -eq 0 -and $count2 -eq 0 -and $count3 -eq 1)

答案 4 :(得分:0)

在我的 Azure 构建/部署管道中,我像这样使用它来启动和停止服务(之前已经异步发送了“停止”命令之后)并且适用于所有过渡状态,例如 Starting、{{1 }}、StoppingPausing(在状态枚举 ServiceControllerStatus 中分别称为 ResumingStartPendingStopPendingPausePending ).

ContinuePending

这需要传统的 powershell 才能在远程服务器上运行,# Wait for services to be stopped or stop them $ServicesToStop | ForEach-Object { $MyService = Get-Service -Name $_ -ComputerName $Server; while ($MyService.Status.ToString().EndsWith('Pending')) { Start-Sleep -Seconds 5; $MyService.Refresh(); }; $MyService | Stop-Service -WarningAction:SilentlyContinue; $MyService.Dispose(); }; 的 cmdlet 不包含参数 pwsh.exe

在我看来,不需要计数器,因为只有过渡状态会导致 cmdlet 失败,并且它们在不久的将来无论如何都会更改为受支持的状态之一(-ComputerName 命令最多 125 秒)。