PowerShell Start-Service无休止地运行

时间:2017-10-04 13:16:25

标签: powershell timeout

问题

所以我有一段代码意味着启动一项服务,并且如果它需要太长时间并且在大多数情况下工作正常,则会使服务超时。不幸的是,当此服务尝试启动无法启动的服务时,它将显示以下警告消息:

WARNING: Waiting for 'ServiceName <ServiceName>' to start...

此消息将每1-2秒显示一次,但永远不会发生超时,并且Start-Service操作似乎无休止地继续。我可以安全地验证它至少会持续30分钟(在我手动杀死动作之前)。

代码如下:

Start-Service $ServiceName -ErrorAction SilentlyContinue
$results = Wait-ServiceState -ServiceName $ServiceName -ServiceState 'Running' -SecondsToWait $SecondsToWait

Function Wait-ServiceState {
    Param (...)
    Process {
        Try {
            $check = Get-Service $ServiceName
            $timeout = New-TimeSpan -Seconds $SecondsToWait

            $check.WaitForStatus($ServiceState, $timeout.ToString())

            If ($check.Status -ne $ServiceState) { return $False }
            Else { return $true }
        }
        Catch {
            # do nothing: handled by an upper level function
        }
    }
}

我已经针对其他一些服务测试了上述功能,看起来效果很好。我也成功地将它与Stop-Service一起用于绝对零问题。我整个上午一直在搜索线程,甚至找不到任何类似的东西。我不知道我错过了什么......

问题

有没有人知道为什么它不像它应该的那样超时?也许甚至知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

向@BaconBits大声说出他的建议:

转换以下行:

Start-Service $ServiceName -ErrorAction SilentlyContinue

要:

$s = Get-Service $ServiceName
$s.Start()

应用程序停止在Start-Service行上并成功前进到WaitForStatus行,所有内容都按照我预期的方式处理,无论启动是否成功。

然而,似乎一个在另一个上的使用在很大程度上取决于您是否在管理模式下运行。

答案 1 :(得分:0)

这是启动服务并等待指定时间启动服务的一种方法。如果服务成功启动则返回0,如果1)服务不存在,则返回错误代码; 2)服务已在运行,或者3)代码超时等待服务启动。

$ERROR_SERVICE_REQUEST_TIMEOUT = 1053
$ERROR_SERVICE_ALREADY_RUNNING = 1056
$ERROR_SERVICE_DOES_NOT_EXIST  = 1060

function Start-Service {
  param(
    [String] $serviceName,
    [Int32] $timeoutSeconds
  )
  $service = Get-Service $serviceName
  if ( -not $service ) {
    return $ERROR_SERVICE_DOES_NOT_EXIST
  }
  if ( $service.Status -eq [ServiceProcess.ServiceControllerStatus]::Running ) {
    return $ERROR_SERVICE_ALREADY_RUNNING
  }
  $timeSpan = New-Object Timespan 0,0,$timeoutSeconds
  try {
    $service.Start()
    $service.WaitForStatus([ServiceProcess.ServiceControllerStatus]::Running, $timeSpan)
    return 0
  }
  catch [Management.Automation.MethodInvocationException],[ServiceProcess.TimeoutException] {
    return $ERROR_SERVICE_REQUEST_TIMEOUT
  }
}