Як примусово завершити процес зависла служби в Windows?

Як завершити процес служби Windows, що зависла в статусі stopping (зупинка)? Думаю, більшість адміністраторів Windows, зустрічалося з ситуаціями, коли при спробі зупинити (перезапустити) службу з графічного інтерфейсу консолі управління службами (Services.msc), служба зависає намертво і висить в статусі 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.

При спробі зупинити таку службу командою: net stop wuauserv, з'являється повідомлення:

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

зміст:

  • Завершення зависла служби за допомогою TaskKill
  • Примусове завершення зависла служби з PowerShell
  • Аналіз завислих процесів з допомогою Resmon
  • Process Explorer: Завершення завислого процесу з-під SYSTEM

Завершення зависла служби за допомогою TaskKill

Найпростіший спосіб завершити зависла служу - скористатися утилітою taskkill. В першу чергу потрібно визначити PID (Ідентифікатор процесу) нашої служби. Як приклад візьмемо службу Windows Update, її системне ім'я wuauserv (Ім'я можна подивитися у властивостях служби в консолі services.msc).

Досить часто ця проблема трапляється зі службою Windows Modules Installer при перезавантаженні сервера, особливо після установки оновлень на Windows Server 2012 R2 / 2008 R2.важливо. Будьте уважними. Примусова відставка процесу критичних служб Windows може призвести до BSOD або перезавантаження системи.

У командному рядку з правами адміністратора (це важливо, інакше буде помилка access denied):
sc queryex wuauserv

В даному випадку PID процесу - 816.

Щоб примусово закінчити завислий процес з PID 816:

taskkill / PID 816 / F

SUCCESS: The process with PID 816 has been terminated.

Дана команда примусово завершить процес служби. В подальшому можна повернутися в консоль управління службами і вручну стартувати службу (або зовсім видалити цю службу, якщо вона не потрібна).

"Постріл в голову" зависла служби можна виконати і елегантніше, не виконуючи ручне визначення PID процесу. У утиліти taskkill є параметр / FI, що дозволяє використовувати фільтр для вибору необхідних служб або процесів. Ви можете зупинити конкретну службу командою:

TASKKILL / F / FI "SERVICES eq wuauserv"

Або можна взагалі не вказувати ім'я, служби, завершивши всі сервіси в завислому стані за допомогою команди:

taskkill / F / FI "status eq not responding"

Після цього служба, зависла в статусі Stopping повинна зупинитися.

Примусове завершення зависла служби з PowerShell

Також ви можете використовувати PowerShell для примусової зупинки служби. За допомогою наступної команди можна отримати список служб, що перебувають в стані Stopping:

Get-WmiObject -Class win32_service | Where-Object $ _. State -eq 'stop pending'

Завершити процес для всіх знайдених служб допоможе командлет Stop-Process. Об'єднавши обидві операції в цикл, отримаємо скрипт, автоматично завершальний всі процеси підвішеному служб в системі:

$ 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"

Аналіз завислих процесів з допомогою Resmon

Ви можете визначити процес, через який зависла служба за допомогою монітора ресурсів resmon.

  1. У вікні Монітора ресурсів перейдіть на вкладку ЦП (CPU) і знайдіть процес зависла служби;
  2. Виберіть пункт Аналіз ланцюжка очікування (Analyze Wait Chain);
  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;
  4. У дозволу служби надайте права Full Control для групи адміністраторів (Administrators). Збережіть зміни;
  5. Тепер спробуйте завершити процес служби.Обратіте увагу, що права на службу і її процес видалися тимчасово, перш її перезапуску. Для надання постійних прав на служби познайомтеся до статті Права на служби в Windows.