问题
因此,我有一个代码块,旨在启动服务,如果花费太长,并且在大多数情况下工作正常,则需要进行服务。不幸的是,当此服务试图启动无法启动的服务时,它将显示以下警告消息:
WARNING: Waiting for 'ServiceName <ServiceName>' to start...
此消息将每1-2秒显示一次,但是超时从未发生过,而开始服务的动作似乎无休止地继续。我可以安全地验证它至少会持续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
一起使用,但绝对零问题。我整个早晨都在搜索线程,甚至找不到任何遥不可及的东西。我不知道我缺少什么...
问题
有人想知道为什么它不像它应该的那样出现吗?也许甚至知道如何解决这个问题?
这是启动服务并等待指定时间开始的一种方法。如果服务成功启动,它将返回0,或者如果不存在该服务,则返回错误代码,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
}
}
大喊@baconbits的建议:
通过转换以下行:
Start-Service $ServiceName -ErrorAction SilentlyContinue
to:
$s = Get-Service $ServiceName
$s.Start()
应用程序停止挂在Start-Service
线上,并成功地进入WaitforStatus行,并且一切都以我期望的方式进行处理,无论开始是否成功。
但是,似乎一个在另一个方面的使用很大程度上取决于您是否处于管理模式。
这是尝试其他所有内容后对我有用的方法:
首先,确保服务没有"禁用"。看来,微软已经提出了一些增加的权限,以便能够启动残疾人服务,而它曾经工作正常。将其更改为这样的自动或手册:
get-service <ServiceName> | set-service StartupType <Automatic or Manual>
然后以这种方式运行开始命令:
get-service <ServiceName> | start-service -WarningAction SilentlyContinue
请注意,这不是-eroraction,我使用过很多次,但是 - 我从没想过我什至需要使用的warningAction。
该命令安静地运行并返回提示。这些烦人的警告都不是:消息。