当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 终止在停止或启动时卡住的 Windows 服务

作者:精品下载站 日期:2024-12-14 23:07:31 浏览:12 分类:玩电脑

终止在停止或启动时卡住的 Windows 服务


如何手动终止堆栈位于“的Windows服务进程

Stopping

“ 或者 ”

Starting

“ 状态?大多数 Windows 管理员在尝试启动/停止/重新启动服务时都遇到过这样的问题,但服务却停留在正在停止(或正在启动)状态。您将无法从服务管理控制台停止此服务(

services.msc

),因为该服务的所有控制按钮都变为非活动状态(灰显)。最简单的方法是重新启动 Windows,但这并不总是可以接受的。让我们看一下替代方法,它可以在不重新启动系统的情况下强制终止卡住的 Windows 服务或进程。

[玩转系统] 终止在停止或启动时卡住的 Windows 服务

如果在尝试停止服务后 30 秒内仍未停止,Windows 将显示以下消息:

Windows Could not stop the xxxxxx service on Local Computer
Error 1053: The service did not respond in a timely fashion.

服务控制管理器等待服务启动或停止的超时时间可以使用 ServicesPipeTimeout 注册表参数进行更改。如果服务未在指定超时内启动,Windows 会向事件查看器发送错误(事件 ID:7000、7009、7011,超时时间已达到 30000 毫秒)。您可以将此超时增加到 60 秒,例如:

reg add HKLM\SYSTEM\CurrentControlSet\Control /v ServicesPipeTimeout /t REG_SZ /d 600000 /f

当启动/停止没有足够时间正确终止所有进程并关闭文件的繁重服务(例如,MS SQL Server)时,这非常有用。

如果您尝试从命令提示符停止此类服务:

net stop wuauserv

,出现一条消息:

The service is starting or stopping. Please try again later.

[玩转系统] 终止在停止或启动时卡住的 Windows 服务

或者 :

Windows could not stop the Service on Local Computer.
[SC] ControlService Error 1061: The service cannot accept control messages at this time.

如何使用 TaskKill 强制终止卡住的 Windows 服务?

停止卡住的服务的最简单方法是使用内置的 taskkill 命令行工具。首先,您需要找到服务的PID(进程标识符)。我们以 Windows 更新服务为例。其系统名称为

wuauserv

(您可以在服务属性中检查名称

services.msc

安慰)。

服务器重新启动时,Windows Modules Installer 服务挂起的情况很常见,尤其是在 Windows Server 2012 R2 和 2016 上安装更新后。

重要。留心。强制终止关键 Windows 服务可能会导致 BSOD 或系统意外重新启动。

在提升的命令提示符中运行此命令(这很重要,否则会出现访问被拒绝的错误):

sc queryex wuauserv

在我们的例子中,wuauserv 服务的 PID 是 9186。
要强制终止 PID 9186 的卡住进程,请运行以下命令:

taskkill /PID 9168 /F

[玩转系统] 终止在停止或启动时卡住的 Windows 服务

SUCCESS: The process with PID 9168 has been terminated.

该命令将强制终止服务进程。现在您可以使用以下命令启动服务

sc start servicename

命令或通过服务管理控制台

您可以更优雅地停止挂起的服务,而无需手动检查服务进程的PID。 taskkill 工具具有/FI 选项,允许您使用过滤器来选择必要的服务或进程。您可以使用以下命令终止特定服务:

taskkill /F /FI "SERVICES eq wuauserv"

或者您可以完全跳过服务名称并使用以下命令终止所有处于挂起状态的服务:

taskkill /F /FI "status eq not responding"

之后,堆栈中处于 Stopping 状态的服务应该停止。

您还可以使用 taskkill 实用程序强制停止远程计算机上的挂起服务:

taskkill /S mun-fs01 /F /FI "SERVICES eq wuauserv"

使用 PowerShell 强制停止卡住的 Windows 服务

您还可以使用 PowerShell 强制停止服务。使用以下命令可以获取处于 Stopping 状态的服务列表:

Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'stop pending'}

或者在启动状态:

Get-WmiObject -Class win32_service | Where-Object {$_.state -eq 'start pending'}

[玩转系统] 终止在停止或启动时卡住的 Windows 服务

Stop-Process cmdlet 允许终止所有找到的服务的进程。以下 PowerShell 脚本将终止 Windows 上所有卡住的服务进程:

$Services = Get-WmiObject -Class win32_service -Filter "state = 'stop pending'"
if ($Services) {
foreach ($service in $Services) {
try {
Stop-Process -Id $service.processid -Force -PassThru -ErrorAction Stop
}
catch {
Write-Warning -Message "Error. Error details: $_.Exception.Message"
}
}
}
else {
Write-Output "No services with 'Stopping'.status"
}

[玩转系统] 终止在停止或启动时卡住的 Windows 服务

您必须使用

Get-CimInstance

而不是

Get-WmiObject

新的 PowerShell Core 6.x/7.x 中的 cmdlet。将脚本的第一个命令替换为:

$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'

使用 ResMon 分析挂起服务的等待链

您可以使用resmon.exe(资源监视器)检测导致服务挂起的进程。

  1. 在“资源监视器”窗口中,进入“CPU”选项卡,找到挂起的服务进程;

  2. 从上下文菜单中选择分析等待链项;

    [玩转系统] 终止在停止或启动时卡住的 Windows 服务

  3. 在新窗口中,您很可能会看到您的进程正在等待另一个进程。结束该过程。如果您正在等待 svchost.exe 或其他系统进程,则无需终止它。尝试分析此过程的等待链。找到 svchost.exe 正在等待的进程的 PID 并将其杀死。

使用 Process Explorer 终止挂起的服务

即使本地管理员也无法终止某些在 SYSTEM 帐户下运行的进程。事实上,管理员帐户根本没有某些进程或服务的权限。要停止这样的进程(服务),需要将服务(进程)的权限授予本地Administrators组,然后将其杀死。为此,我们需要两个小工具:psexec.exeProcessExplorer(可在 Microsoft 网站上找到)。

  1. 要使用系统权限 (runas SYSTEM) 启动 ProcessExplorer,请使用以下命令:

     PSExec -s -i ProcExp.exe
  2. 在Process Explorer进程列表中,找到卡住的服务进程并打开其属性;

  3. 转到服务选项卡,找到您的服务并单击权限按钮;

    [玩转系统] 终止在停止或启动时卡住的 Windows 服务

  4. 管理员授予服务权限中的“完全控制”权限。 保存更改;

    [玩转系统] 终止在停止或启动时卡住的 Windows 服务

  5. 现在尝试停止服务进程。

    请注意,该服务的权限是暂时授予的,直到重新启动为止。要授予服务的永久权限,请参阅文章设置 Windows 服务的权限。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯