Администраторы Windows могут столкнуться с ситуацией, когда при попытке остановить (запустить) какую-то службу из графической оснастки управления службами
Services.msc
, служба зависает в статусе Stopping (или Starting). При этом кнопки управления службой (Start, Stop, Restart) становятся недоступными (серыми). В этой статье мы рассмотрим, как принудительно завершить процесс зависшей службы без необходимости перезагрузки сервера/компьютера (что может Windows.
Если в течении 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.
Или:
[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
).
Затем в командной строке с правами администратора, выполните:
sc queryex wuauserv
Это вернёт PID процесса службы (
9186
в нашем примере).
Теперь, воспользуйтесь утилитой taskkill чтобы завершите зависший процесс с PID 9186:
taskkill /PID 9168 /F
SUCCESS: The process with PID 9168 has been terminated.
После того, как зависший процесс службы завершен, вы можете запустить ее командой
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
Принудительное завершение зависшей службы через PowerShell
С помощью PowerShell также можно обнаружить службы, находящиеся в состоянии Stopping:
Get-CIMInstance -Class win32_service | Where-Object {$_.state -eq 'stop pending'}
Следующий 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"
}
Анализ цепочки ожидания зависшей службы с помощью ResMon
С помощью утилиты Resource Monitor (
resmon.exe
) можно определить процесс, из-за которого зависла служба и завершить его:
- В окне Монитора ресурсов перейдите на вкладку ЦП (CPU) и найдите процесс зависшей службы;
- Выберите пункт Анализ цепочки ожидания (Analyze Wait Chain);
- В новом окне скорее всего вы увидите, что ваш процесс ожидает другой процесс. Завершите его. Если выполняется ожидание системного процесса svchost.exe, завершать его не нужно. Попробуйте проанализировать цепочку ожидания для этого процесса. Найдите PID процесса, которого ожидает ваш svchost.exe и завершите его
Process Explorer: Завершение зависшего процесса из-под SYSTEM
Некоторые процессы, запущенные из-под SYSTEM, не сможет завершить даже пользователь с правами локального администратора. Чтобы завершить такой процесс (служб), вам необходимо предоставить локальной группе Administrators права на службу (процесс), а потом завершить его. Для этого нам понадобятся две утилиты: psexec.exe и ProcessExplorer (доступны на сайте Microsoft).
- Чтобы запустить утилиту ProcessExplorer с правами системы (SYSTEM), выполните команду:
PSExec -s -i ProcExp.exe
- В списке процессов Process Explorer найдите процесс зависшей службы и откройте ее свойства;
- Перейдите на вкладку Services, найдите свою службу и нажмите кнопку Permissions;
- В разрешения службы предоставьте права Full Control для группы администраторов (Administrators). Сохраните изменения;
- Теперь попробуйте завершить процесс службы. Права на службу и ее процесс выдаются временно, до ее перезапуска. Для предоставления постоянных прав на службы познакомьтесь со статьей Права на службы в 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).
Как обычно всё проще:
TASKKILL /F /FI «SERVICES eq wuauserv»
taskkill /F /FI «status eq not responding»
нужно обратить внимание на то, что вышеописанное убьёт процесс, со всеми запущенными службами, а не только одну зависшую службу. Это для системы может быть фатальным, если убивается процесс svchost.exe
Самый простой способ узнать какие службы работают в этом процессе — в task manager windows 7 (windows 2008) на вкладке Процессы щёлкнуть правой кнопкой по соответствующему процессу и выбрать из контекстного меню пункт «Перейти к службам». Откроется вкладка Службы, с выделенными службами в процессе.
Админ, собственноручно прибивающий процесс svchost.exe должен страдать 🙂
Процесс убивается по PID-у. Если вы обратите внимание, у разных svchost они разные.
Спасибо!