Как принудительно завершить зависшую службу в Windows?

Администраторы Windows могут столкнуться с ситуацией, когда при попытке остановить (запустить) какую-то службу из графической оснастки управления службами Services.msc , служба зависает в статусе Stopping (или Starting). При этом кнопки управления службой (Start, Stop, Restart) становятся недоступными (серыми). В этой статье мы рассмотрим, как принудительно завершить процесс зависшей службы без необходимости перезагрузки сервера/компьютера (что может Windows.

служба windows зависла в статусе stopping и не выключается

Если в течении 30 секунд после попытки остановки службы, она не останавливается, Windows выводит сообщение:

Не удалось остановить службу xxxxxxx Windows на локальном компьютере.
Ошибка 1053. Служба не ответила на запрос своевременно.
Windows Could not stop the xxxxxx service on Local Computer
Error 1053: The service did not respond in a timely fashion.

Или

Error 1061: The service cannot accept control messages at this time.

Зависшая служба также не реагирует на попытки ее остановить (запустить) из командной строки. Например, команда net stop wuauserv , вернет сообщение:

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

net stop The service is starting or stopping. Please try again letter.

Или:

[SC] ControlService: ошибка: 1061: 
Служба в настоящее время не может принимать команды.
Windows could not stop the Service on Local Computer.
Error 1061: The service cannot accept control messages at this time.

Рассмотрим, как безопасно остановить зависшую службу, не перегружая сервер Windows посреди рабочего дня.

Как остановить зависшую службу Windows из командной строки?

Для завершения зависшей службой можно воспользоваться консольной утилитой taskkill. Она позволяет завершить процесс службы по его идентификатору (PID). Откройте консоль services.msc , найдите зависшую службу и откройте ее свойства. Скопируйте имя службы (Service Name ).

Узнать системное имя службы в Windows

Затем в командной строке с правами администратора, выполните:

sc queryex wuauserv

Это вернёт PID процесса службы ( 9186 в нашем примере).

Теперь, воспользуйтесь утилитой taskkill чтобы завершите зависший процесс с PID 9186:

taskkill /PID 9168 /F

завершить зависшую службу из командной строки с помощью утилиты taskkill

SUCCESS: The process with PID 9168 has been terminated.
Важно. Принудительная отставка процесса критичной службы Windows может привести к BSOD или перезагрузке операционной системы.

После того, как зависший процесс службы завершен, вы можете запустить ее командой sc start servicename или через консоль управления службами (или совсем удалить эту службу, если она не нужна).

Чтобы вручную не искать PID процесса службы, можно воспользоваться более элегантной командой. Параметр /FI утилиты taskkill позволяет отфильтровать процессы по имени службы. В этом случае вместо двух действий (поиск PID и завершение процесса), достаточно сразу выполнить:

TASKKILL /F /FI "SERVICES eq wuauserv"

Или завершить все службы в зависшем состоянии с помощью команды:

taskkill /F /FI "status eq not responding"

Также утилиту taskkill может принудительно остановить зависшую службы на удаленном компьютере:

TASKKILL /S 192.168.12.15 /F /FI "SERVICES eq wuauserv" /U MyDomain\user

Очень часто можно встретится с зависанием службы Windows Modules Installer при перезагрузке сервера, особенно после установки обновлений на Windows Server.

Принудительное завершение зависшей службы через PowerShell

С помощью PowerShell также можно обнаружить службы, находящиеся в состоянии Stopping:

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

poweshell список служб в статусе stop pending

В старых версиях PowerShell (1.0, 2.0) вместо современного командлета Get-CIMInstance нужно использовать Get-WmiObject (не поддерживается в новом PowerShell Core 7.x).

Следующий PowerShell скрипт завершит все процессы зависших служб в Windows (для принудительной остановки используется командлет Stop-Process -Force ).

$Services = Get-CIMInstance -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"
}

powershell скрипт для принудительной остановки всех зависших служб

Анализ цепочки ожидания зависшей службы с помощью ResMon

С помощью утилиты Resource Monitor ( resmon.exe ) можно определить процесс, из-за которого зависла служба и завершить его:

  1. В окне Монитора ресурсов перейдите на вкладку ЦП (CPU) и найдите процесс зависшей службы;
  2. Выберите пункт Анализ цепочки ожидания (Analyze Wait Chain);resmon анализ цепочки ожидания зависшей службы
  3. В новом окне скорее всего вы увидите, что ваш процесс ожидает другой процесс. Завершите его. Если выполняется ожидание системного процесса svchost.exe, завершать его не нужно. Попробуйте проанализировать цепочку ожидания для этого процесса. Найдите PID процесса, которого ожидает ваш svchost.exe и завершите его

Process Explorer: Завершение зависшего процесса из-под SYSTEM

Некоторые процессы, запущенные из-под SYSTEM, не сможет завершить даже пользователь с правами локального администратора. Чтобы завершить такой процесс (служб), вам необходимо предоставить локальной группе Administrators права на службу (процесс), а потом завершить его. Для этого нам понадобятся две утилиты: psexec.exe и ProcessExplorer (доступны на сайте Microsoft).

  1. Чтобы запустить утилиту ProcessExplorer с правами системы (SYSTEM), выполните команду: PSExec -s -i ProcExp.exe
  2. В списке процессов Process Explorer найдите процесс зависшей службы и откройте ее свойства;
  3. Перейдите на вкладку Services, найдите свою службу и нажмите кнопку Permissions;procexplorer - задать права на службу
  4. В разрешения службы предоставьте права Full Control для группы администраторов (Administrators). Сохраните изменения;полные права на службу для администратора
  5. Теперь попробуйте завершить процесс службы.
    Права на службу и ее процесс выдаются временно, до ее перезапуска. Для предоставления постоянных прав на службы познакомьтесь со статьей Права на службы в Windows.

Таймаут, в течении которого Service Control Manager ждет ожидания запуска или остановки службы можно изменить через параметр реестра ServicesPipeTimeout. Если служба не запускается в течении указанного таймаута, Windows записывает ошибку в Event Log (Event ID: 7000, 7009, 7011, A timeout was reached 30000 milliseconds). Вы можете увеличить этот таймаут, например до 60 секунд:

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

Это бывает полезным при запуске/остановки тяжелых служб, которые не успевают завершить все процессы быстро (например, MS SQL Server).

служба mssql зависает при запуске


Предыдущая статья Следующая статья


Комментариев: 6 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)