Domanda

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

È stato utile?

Soluzione 2

If you have a list of service names (say in an array), then foreach service:

  1. Get its status
  2. If not running, then start it
  3. With a delay in the loop, check its status until it is running

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.

Altri suggerimenti

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.

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)}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top