Убить службу 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 отправляет ошибку в средство просмотра событий (Event 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 could not stop the Service on Local Computer.
[SC] ControlService Error 1061: The service cannot accept control messages at this time.

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

Самый простой способ остановить застрявшую службу — использовать встроенный taskkill инструмент командной строки. Прежде всего, вам необходимо найти PID (идентификатор процесса) службы. В качестве примера возьмем службу Windows Update. Ее системное имя wuauserv (имя можно проверить в свойствах службы в разделе services.msc консоли).

Важно. Будьте внимательны. Принудительное завершение критических служб Windows может привести к BSOD или неожиданному перезапуску системы.

Выполните эту команду в поднятой командной строке (это важно, иначе появится ошибка «Доступ запрещен»):
sc queryex wuauserv
В нашем случае PID службы wuauserv равен 9186.
Чтобы принудительно убить застрявший процесс с PID 9186, выполните команду:

taskkill /PID 9168 /F

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

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"

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

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

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

Или в состоянии запуска:

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

список служб со статусом "Ожидается остановка"

Сайт Stop-Process Команда позволяет завершить процессы всех найденных служб. Следующий сценарий 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"
}

сценарий powershell для завершения застрявшего процесса службы

Вы должны использовать Get-CimInstance вместо Get-WmiObject команды в новой версии PowerShell Core 6.x/7.x. Замените первую команду сценария на:$Services = Get-CimInstance -Class win32_service | where-Object state -eq 'stop pending'

Анализ цепочек ожидания на службах Hung с помощью ResMon

Вы можете обнаружить процесс, вызвавший зависание службы, с помощью функции resmon.exe (Монитор ресурсов).

  1. В окне Resource Monitor перейдите на вкладку CPU и найдите зависший процесс службы;
  2. Выберите пункт Анализ цепочки ожидания из контекстного меню;Ресурс Monito анализирует цепочку ожидания
  3. В новом окне вы, скорее всего, увидите, что ваш процесс ожидает другой процесс. Завершите процесс. Если вы ожидаете svchost.exe или другой системный процесс, не нужно его завершать. Попробуйте проанализировать цепочку ожидания этого процесса. Найдите PID процесса, который ожидает ваш svchost.exe, и завершите его.

Убийство зависшей службы с помощью Process Explorer

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

  1. Чтобы запустить ProcessExplorer с системными привилегиями (runas SYSTEM), используйте команду: PSExec -s -i ProcExp.exe
  2. В списке процессов Process Explorer найдите застрявший служебный процесс и откройте его свойства;
  3. Перейдите в раздел Услуги , найдите свою службу и нажмите кнопку Разрешения кнопка;разрешения службы proccess explorer
  4. Предоставьте право полного контроля в разрешениях службы для Администраторы группа. Сохраните изменения;предоставление администратору прав полного контроля над службой windows
  5. Теперь попробуйте остановить процесс службы.
    Обратите внимание, что права на службу предоставляются временно, пока она не будет перезапущена. Для предоставления постоянных прав на службу следуйте статье Установка прав на службу Windows.

Добавить комментарий

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