I need to start an ordered sequence of services, i need that each service will be up and running before try to start the next one, how can I achieve this in Powershell? How can I wait for the stop too?
Thanks,
DD
Don't do this manually (regardless of scripting language). Define proper dependencies between the services and Windows will start/stop them in the correct order. You can use the sc
utility to define the dependencies:
sc config Svc2 depend= Svc1
If a service should depend on more than one other service you separate the dependent services with forward slashes:
sc config Svc5 depend= Svc3/Svc4
Note that the =
must be followed by a space and must not be preceded by one.
If you have a list of service names (say in an array), then foreach service:
The key is likely to be handling all the possibilities for #3 including the service failing.
But an outline would be something like (without handling the error cases):
$serviceNames | Foreach-Object -Process {
$svc = Get-Service -Name $_
if ($svc.Status -ne 'Running') {
$svc.Start()
while ($svc.Status -ne 'Running') {
Write-Output "Waiting for $($svc.Name) to start, current status: $($svc.Status)"
Start-Sleep -seconds 5
}
}
Write-Output "$($svc.Name) is running"
}
Get-Service
returns an instance of System.ServiceProcess.ServiceController
which is "live"—indicating the current state of the service, not just the state when the instance was created.
A similar stop process would replace "Running" with "Stopped" and the "Start" call with "Stop". And, presumably, reverse the order of the list of services.
To stop Services
$ServiceNames = Get-Service | where {($_.Name -like "YourServiceNameHere*")-and ($_.Status -eq "Running")}
Foreach-Object {$_.(Stop-Service $serviceNames)}
To start Services
$ServiceNames = Get-Service | where {($_.Name -like "YourServiceNameHere*")-and ($_.Status -ne "Running")}
Foreach-Object {$_.(Start-Service $ServiceNames)}
To start and wait in order
[array]$Services = 'svc1', 'svc2', 'svc3'
$Services | foreach {
start-service $_
(get-service $_).WaitForStatus('Running')
}
The wait for status might not be needed. I have no system that have slow services to test with.
To stop and wait in order
[array]$Services = 'svc1', 'svc2', 'svc3'
[array]::Reverse($Services)
$Services | stop-service
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.