【问题标题】:Powershell - Start ordered sequence of servicesPowershell - 启动有序的服务序列
【发布时间】:2013-09-24 06:49:52
【问题描述】:

我需要启动一个有序的服务序列,我需要在尝试启动下一个服务之前启动并运行每个服务,我如何在 Powershell 中实现这一点?我怎么也能等到站呢?

谢谢,

DD

【问题讨论】:

    标签: windows powershell service database-administration


    【解决方案1】:

    不要手动执行此操作(无论脚本语言如何)。定义服务之间的正确依赖关系,Windows 将以正确的顺序启动/停止它们。您可以使用sc 实用程序来定义依赖项:

    sc config Svc2 depend= Svc1
    

    如果一个服务应该依赖多个其他服务,你可以用正斜杠分隔依赖的服务:

    sc config Svc5 depend= Svc3/Svc4
    

    请注意,= 必须后跟一个空格,不得前面有一个。

    【讨论】:

      【解决方案2】:

      如果你有一个服务名称列表(比如在一个数组中),那么 foreach 服务:

      1. 获取其状态
      2. 如果没有运行,则启动它
      3. 在循环中有延迟,检查它的状态直到它运行

      关键可能是处理#3 的所有possibilities,包括服务失败。

      但大纲可能类似于(不处理错误情况):

      $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 返回一个 System.ServiceProcess.ServiceController 的实例,它是“活动的”——表示服务的当前状态,而不仅仅是创建实例时的状态。

      类似的停止过程会将“正在运行”替换为“已停止”,将“开始”调用替换为“停止”。而且,大概是颠倒服务列表的顺序。

      【讨论】:

      • svc 对象不是那么活跃.. 反正我喜欢这种方法。
      【解决方案3】:

      停止服务

      $ServiceNames = Get-Service | where {($_.Name -like "YourServiceNameHere*")-and ($_.Status -eq "Running")}
       Foreach-Object {$_.(Stop-Service $serviceNames)}
      

      启动服务

      $ServiceNames = Get-Service | where {($_.Name -like "YourServiceNameHere*")-and ($_.Status -ne "Running")}
      Foreach-Object {$_.(Start-Service $ServiceNames)}
      

      【讨论】:

        猜你喜欢
        • 2013-01-12
        • 1970-01-01
        • 2019-04-25
        • 2023-04-09
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多