lar*_*ryq 11 powershell windows-services cmdlet
我们使用stop-service cmdlet来杀死我们盒子上的一些服务.大部分时间它都很棒,但是我们有一两个服务(谁没有?),偶尔也不会玩得很好.
在这种情况下,其中一个服务将保持停止状态,cmdlet会一遍又一遍地将其输出到控制台:
[08:49:21]WARNING: Waiting for service 'MisbehavingService (MisbehavingService)' to finish
[08:49:21]stopping...
[08:49:23]WARNING: Waiting for service 'MisbehavingService (MisbehavingService)' to finish
[08:49:23]stopping...
[08:49:25]WARNING: Waiting for service 'MisbehavingService (MisbehavingService)' to finish
[08:49:25]stopping...
Run Code Online (Sandbox Code Playgroud)
最终我们必须在任务管理器中终止服务,然后我们的脚本继续.
有没有办法让stop-service cmdlet在某个点之后放弃或超时?我想我们可以在之后检查,如果服务仍然在运行,请使用kill-process cmdlet提供最终的印章.
Jam*_*phy 11
虽然Stop-Service没有超时参数,但类上的WaitForStatus方法System.ServiceController确实有一个带有超时参数的重载(此处记录).幸运的是,这正是Get-Service命令返回的对象类型.
这是一个简单的函数,它以秒为单位获取服务名称和超时.它返回$true如果到达超时之前该服务停止,并且$false如果调用超时(或者,如果服务不存在).
function Stop-ServiceWithTimeout ([string] $name, [int] $timeoutSeconds) {
$timespan = New-Object -TypeName System.Timespan -ArgumentList 0,0,$timeoutSeconds
$svc = Get-Service -Name $name
if ($svc -eq $null) { return $false }
if ($svc.Status -eq [ServiceProcess.ServiceControllerStatus]::Stopped) { return $true }
$svc.Stop()
try {
$svc.WaitForStatus([ServiceProcess.ServiceControllerStatus]::Stopped, $timespan)
}
catch [ServiceProcess.TimeoutException] {
Write-Verbose "Timeout stopping service $($svc.Name)"
return $false
}
return $true
}
Run Code Online (Sandbox Code Playgroud)
停止服务没有超时选项,但是如果有依赖服务,则可能需要使用-force。
服务可以在启动时定义等待提示(指定超时),但是超时由服务控制。任何服务控制请求(启动,停止,暂停,恢复)都将通过服务控制管理器(SCM),并将遵守每个服务的等待提示。如果超过了等待提示,该操作将失败并返回错误。
您可以使用invoke-command将Stop-Service作为作业运行并定期检查它。如果尚未完成,则可以使用Stop-Process终止该进程并继续。
| 归档时间: |
|
| 查看次数: |
10349 次 |
| 最近记录: |