首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stop-服务cmdlet超时可能吗?

stop-服务cmdlet超时可能吗?
EN

Stack Overflow用户
提问于 2012-09-22 00:09:09
回答 3查看 14.2K关注 0票数 17

我们正在使用stop-service cmdlet来终止我们机器上的一些服务。大多数情况下,它工作得很好,但是我们有一两个服务(谁没有呢?)偶尔不会玩得很好。

在这种情况下,其中一个有问题的服务将保持停止状态,并且cmdlet一次又一次地将其发送到控制台:

代码语言:javascript
复制
[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...

最终,我们必须终止任务管理器中的服务,然后我们的脚本继续执行。

有没有办法让stop-service cmdlet在某个时间点后放弃或超时?我认为我们可以在之后检查,如果服务仍在运行,使用kill-process cmdlet来提供最后的印章。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-22 00:33:09

stop-service没有超时选项,但如果存在依赖服务,则可能需要使用-force。

服务可以在启动时定义等待提示(指定超时),但超时由服务控制。任何服务控制请求(启动、停止、暂停、恢复)都会通过服务控制管理器(SCM),并将遵守每个服务的等待提示。如果超过了wait提示,操作将失败并返回错误。

您可以使用invoke-command将Stop-Service作为作业运行,并定期检查它。如果它还没有完成,你可以使用Stop-Process来终止进程并继续。

票数 7
EN

Stack Overflow用户

发布于 2016-03-08 23:44:34

尽管Stop-Service没有超时参数,但System.ServiceController类上的WaitForStatus方法确实有一个接受超时参数的重载(文档中的here)。幸运的是,这正是Get-Service命令返回的对象类型。

下面是一个简单的函数,它接受一个服务名和一个以秒为单位的超时时间。如果服务在超时之前停止,则返回$true;如果调用超时(或服务不存在),则返回$false

代码语言:javascript
复制
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
}
票数 19
EN

Stack Overflow用户

发布于 2017-05-25 02:06:34

如果您使用的是powershell 5.1,您还需要:

代码语言:javascript
复制
Stop-Service -Name "NameOfService" -NoWait

https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/stop-service

但是如果你没有5.1版本的powershell,@JamesQMurphy的答案看起来也不错。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12534170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档