Jak wymusić zakończenie procesu zawieszonej usługi w systemie Windows?

Jak zakończyć proces usługi Windows, która utknęła w stanie zatrzymania? Myślę, że większość administratorów systemu Windows napotkała sytuacje, gdy podczas próby zatrzymania (ponownego uruchomienia) usługi z interfejsu graficznego konsoli zarządzania usługami (Services.msc) usługa zawiesza się i zawiesza się Zatrzymywanie. Po tym nie można zatrzymać usługi w konsoli, ponieważ przyciski akcji serwisowych stają się niedostępne. Najłatwiej jest zrestartować serwer, ale nie zawsze jest to poprawne. Rozważ alternatywny sposób wymusić usługę zamknięcia lub przetwarzaj bez potrzeby ponownego uruchamiania.

Jeśli w ciągu 30 sekund po próbie zatrzymania usługi nie zostanie ona zatrzymana, system Windows wyświetli komunikat:

Nie udało się zatrzymać usługi Windows xxxxxxx na komputerze lokalnym.
Błąd 1053. Usługa nie mogła zatrzymać usługi xxxxxx na komputerze lokalnym
Błąd 1053: Usługa nie odpowiedziała w odpowiednim czasie.

Podczas próby zatrzymania takiej usługi za pomocą polecenia: net stop wuauserv pojawia się komunikat:

Usługa jest uruchamiana lub zatrzymywana. Proszę spróbować ponownie list.

Treść

  • Kończenie usługi powieszenia za pomocą TaskKill
  • Wymuś zamknięcie zawieszonej usługi z PowerShell
  • Analiza zawieszonych procesów za pomocą Resmon
  • Process Explorer: Kończenie zawieszonego procesu z poziomu SYSTEM

Kończenie usługi powieszenia za pomocą TaskKill

Najłatwiejszym sposobem zakończenia zawieszonej usługi jest użycie narzędzia zadanie. Najpierw musisz ustalić PID (identyfikator procesu) naszej usługi. Jako przykład weźmy usługę Windows Update, nazwę systemu Wuauserv (nazwę można znaleźć we właściwościach usługi w konsoli services.msc).

Dość często ten problem występuje w przypadku usługi Instalatora modułów systemu Windows podczas ponownego uruchamiania serwera, zwłaszcza po zainstalowaniu aktualizacji w systemie Windows Server 2012 R2 / 2008 R2.Jest ważne. Bądź ostrożny. Wymuszona rezygnacja z krytycznych procesów usług Windows może doprowadzić do BSOD lub ponownego uruchomienia systemu.

W wierszu polecenia z uprawnieniami administratora (jest to ważne, w przeciwnym razie wystąpi błąd odmowy dostępu):
sc queryex wuauserv

W tym przypadku PID procesu wynosi 816.

Aby wymusić zakończenie zawieszonego procesu za pomocą PID 816:

taskkill / PID 816 / F

SUKCES: Proces z PID 816 został zakończony.

To polecenie wymusza zakończenie usługi. W przyszłości możesz wrócić do konsoli zarządzania usługami i ręcznie uruchomić usługę (lub całkowicie usunąć tę usługę, jeśli nie jest potrzebna).

Strzał w głowę zawieszonej usługi można wykonać bardziej elegancko, bez konieczności ręcznego określania PID procesu. Narzędzie Taskkill ma opcję / FI, która pozwala użyć filtra do wybrania niezbędnych usług lub procesów. Możesz zatrzymać konkretną usługę za pomocą polecenia:

TASKKILL / F / FI „SERVICES eq wuauserv”

Możesz też w ogóle pominąć nazwę usługi, kończąc wszystkie usługi w stanie zawieszenia za pomocą polecenia:

taskkill / F / FI „status eq nie odpowiada”

Następnie usługa zatrzymana w stanie Zatrzymanie powinna zostać zatrzymana.

Wymuś zamknięcie zawieszonej usługi z PowerShell

Możesz również użyć programu PowerShell, aby wymusić zatrzymanie usługi. Za pomocą następującego polecenia można uzyskać listę usług w stanie Zatrzymywanie:

Get-WmiObject -Class win32_service | Where-Object $ _. Stan -eq „przestań być w toku”

Polecenie cmdlet pomoże ukończyć proces dla wszystkich znalezionych usług. Przestań-Proces. Łącząc obie operacje w pętli, otrzymujemy skrypt, który automatycznie kończy wszystkie procesy zawieszonych usług w systemie:

$ Services = Get-WmiObject -Class win32_service -Filter "state = 'stop pending'"
jeśli ($ Services)
foreach (usługa $ w usłudze $ Services)
spróbuj
Stop-Process -Id $ service.processid -Force -PassThru -ErrorAction Stop

złap
Ostrzeżenie-zapis-komunikat „Błąd. Szczegóły błędu: $ _. Wyjątek. Wiadomość”



jeszcze
Zapis-wyjście „Brak usług z„ Stopping ”.status ”

Analiza zawieszonych procesów za pomocą Resmon

Możesz zidentyfikować proces, który spowodował zawieszenie się usługi za pomocą monitora zasobów resmon.

  1. W oknie Monitora zasobów przejdź do zakładki CPU (CPU) i znajdź proces zawieszonej usługi;
  2. Wybierz element Analiza łańcucha oczekujących (Analizuj Czekaj Łańcuch);
  3. W nowym oknie najprawdopodobniej zobaczysz, że czeka na Ciebie inny proces. Uzupełnij to. Jeśli czekasz na proces systemowy svchost.exe, nie musisz go kończyć. Spróbuj przeanalizować łańcuch oczekiwania dla tego procesu. Znajdź PID procesu, na który czeka svchost.exe, i zakończ go.

Process Explorer: Kończenie zawieszonego procesu z poziomu SYSTEM

Niektóre procesy uruchomione z poziomu SYSTEMU nie mogą zostać zakończone nawet przez lokalnego administratora serwera. Faktem jest, że po prostu może nie mieć prawa do niektórych procesów lub usług. Aby ukończyć taki proces (usługi), należy przyznać administratorom grupy lokalnej uprawnienia do usługi (procesu), a następnie je ukończyć. Aby to zrobić, potrzebujemy dwóch narzędzi: psexec.exe i ProcessExplorer (dostępny na stronie Microsoft).

  1. Aby uruchomić ProcessExplorer z uprawnieniami systemowymi (SYSTEM), musisz uruchomić go w następujący sposób: PSExec -s -i ProcExp.exe
  2. Na liście procesów Process Explorer znajdź proces zawieszonej usługi i otwórz jej właściwości;
  3. Idź do zakładki Usługi, znajdź swoją usługę i kliknij Uprawnienia;
  4. W uprawnieniach usługi udziel uprawnienia Pełna Kontrola dla grupy administratorów (Administratorzy). Zapisz zmiany;
  5. Teraz spróbuj ukończyć proces usługi. Pamiętaj, że prawa do usługi i jej procesu zostały przyznane tymczasowo do czasu ponownego uruchomienia. Aby uzyskać stałe prawa do usług, zobacz Prawa do usługi Windows.