Powershell Подождите, пока сервис будет остановлен или запущен
Я искал как этот форум, так и через google и не могу найти то, что мне нужно.
У меня довольно большой script, и я ищу код, который проверяет, запущена или остановлена служба, прежде чем перейти к следующему шагу.
Функция, которой он сам должен зацикливаться, пока он не остановится или не запустится (для функции "Остановлен" и "Один для запуска" ).
Всего 4 службы, которые имеют почти одинаковое имя, поэтому Service Bus * можно использовать в качестве подстановочного знака.
Ответы
Ответ 1
Следующее закроет и проверяет статус данных сервисов, пока количество служб с состоянием "Запуск" не будет равно нулю (следовательно, они будут остановлены), поэтому вы можете использовать это, если вы ожидаете, что службы остановятся.
Я добавил переменную $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
Я не мог получить стратегию "count", которую написал Микки, чтобы работать, вот как я ее решил:
Я создал функцию, которая принимает 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."
Ответ 3
В дополнение к ответу mgarde этот вкладыш может быть полезен, если вы просто хотите подождать один сервис (также вдохновленный постом Шей Леви):
(Get-Service SomeInterestingService).WaitForStatus('Running')
Ответ 4
Мне пришлось немного подправить это с несколькими счетчиками, потому что эта служба нарочно запускается и останавливается медленно. Оригинальный сценарий поставил меня на правильный путь. Мне пришлось ждать, пока служба полностью остановится, прежде чем я смог продолжить работу, потому что я фактически перезапускаю ту же службу. Технически вы, вероятно, могли бы удалить "сон", но я не против оставить его в покое.
# 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)