
Как вручную убить процесс службы Windows, который застопорился на «Stopping
» или «Starting
» состояние? Большинство администраторов Windows сталкивались с проблемой, когда они пытаются запустить/остановить/перезапустить службу, но она застревает в состоянии Остановка (или Начало) статус. Вы не сможете остановить эту службу из консоли управления службами (services.msc
), поскольку все кнопки управления этой службой становятся неактивными (выделены серым цветом). Самый простой способ — перезапустить 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.
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
консоли).
Выполните эту команду в поднятой командной строке (это важно, иначе появится ошибка «Доступ запрещен»):
sc queryex wuauserv
В нашем случае PID службы wuauserv равен 9186.
Чтобы принудительно убить застрявший процесс с PID 9186, выполните команду:
taskkill /PID 9168 /F
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"
}
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 (Монитор ресурсов).
- В окне Resource Monitor перейдите на вкладку CPU и найдите зависший процесс службы;
- Выберите пункт Анализ цепочки ожидания из контекстного меню;
- В новом окне вы, скорее всего, увидите, что ваш процесс ожидает другой процесс. Завершите процесс. Если вы ожидаете svchost.exe или другой системный процесс, не нужно его завершать. Попробуйте проанализировать цепочку ожидания этого процесса. Найдите PID процесса, который ожидает ваш svchost.exe, и завершите его.
Убийство зависшей службы с помощью Process Explorer
Даже локальный администратор не может завершить некоторые процессы, запущенные под учетной записью SYSTEM. Дело в том, что у учетной записи администратора просто нет прав на некоторые процессы или службы. Чтобы остановить такой процесс (службу), необходимо предоставить права на службу (процесс) группе локальных администраторов, а затем убить их. Для этого нам понадобятся два небольших инструмента: psexec.exe и ProcessExplorer (доступно на сайте Microsoft).
- Чтобы запустить ProcessExplorer с системными привилегиями (runas SYSTEM), используйте команду:
PSExec -s -i ProcExp.exe
- В списке процессов Process Explorer найдите застрявший служебный процесс и откройте его свойства;
- Перейдите в раздел Услуги , найдите свою службу и нажмите кнопку Разрешения кнопка;
- Предоставьте право полного контроля в разрешениях службы для Администраторы группа. Сохраните изменения;
- Теперь попробуйте остановить процесс службы.
Обратите внимание, что права на службу предоставляются временно, пока она не будет перезапущена. Для предоставления постоянных прав на службу следуйте статье Установка прав на службу Windows.