Jak skutecznie zabić zawieszony proces Windows?

Jak skutecznie zabić zawieszony proces Windows?

Autor: Krzysztof Kapustka

Opublikowano: 6/9/2015, 12:00 AM

Liczba odsłon: 18550

Każda uruchamiana w systemie Windows aplikacja działa w ramach co najmniej jednego wątku pracującego w obrębie dedykowanego jej procesu. Jako że działanie aplikacji Windows opiera się w całości na zdarzeniach, komunikacja z uruchomionym programem odbywa się za pośrednictwem systemu operacyjnego, który przy wykorzystaniu specjalnej kolejki przesyła i odbiera od programu różnego rodzaju komunikaty. Na ich podstawie program nie tylko reaguje na bodźce zewnętrzne, takie jak kliknięcie któregoś z przycisków, ale również powiadamia system o swoim bieżącym stanie. W czasie gdy aplikacja oczekuje swobodnie na zdarzenia wejściowe, odpowiednie komunikaty systemowe umieszczane są w jej kolejce celem ich odczytu, przetworzenia i podjęcia odpowiedniej reakcji. Jeśli jednak po upływie kilku sekund, z powodu jakiegoś błędu lub oczekiwania na pewne zdarzenie, program przestanie odpowiadać na przysyłane mu komunikaty, system uzna go i oznaczy jego proces jako zawieszony.

Z pewnością każdy z nas choć raz miał do czynienia z zawieszoną aplikacją. Jak pamiętamy, główne okno aplikacji zostaje podmienione na tzw. okno-duch (ang. ghost window), które w stosunku do oryginału w zasadzie nie różni się niczym poza ostrością poszczególnych elementów graficznych oraz tytułem, do którego doczepiany jest dodatkowy komunikat informujący nas o tym, że program po prostu "nie odpowiada". Całkiem możliwe, że po krótkiej chwili aplikacja sama powróci do pierwotnego stanu i ponownie zacznie reagować na wydawane jej polecenia, ale w większości przypadków, jeśli już dochodzi do zawieszenia się programu, to zwykle jest to już proces nieodwracalny.

Jeśli zaczniemy nerwowo klikać na rozmazanym oknie aplikacji, po chwili system zapyta nas, czy chcemy jeszcze poczekać kilka sekund na powrót prawidłowego stanu danego programu, czy też może chcemy go już zamknąć. Sprawa wygląda na prostą, ale nierzadko zdarza się, że próba zamknięcia zawieszonego zadania przez system nie powiedzie się. Kolejnym więc krokiem jest zazwyczaj uruchomienie Menedżera zadań, wyszukanie realizującego go procesu i wymuszenie jego zamknięcia. Co jednak, gdy również i ta próba zakończy się niepowodzeniem, a my ze względu na inne uruchomione zadania nie chcemy ponownie uruchamiać komputera?

System Windows oferuje nam jeszcze jedno narzędzie administracyjne, które może nas w takiej sytuacji niejednokrotnie poratować. Mowa tu o komendzie wiersza poleceń o nazwie TaskKill.

Jak czytamy w opisie narzędzia, TaskKill umożliwia sprawną terminację zadań systemu Windows na podstawie identyfikatora ich procesu lub nazwy obrazu. Wybrane procesy możemy neutralizować zarówno na maszynie lokalnej, jak i na komputerze zdalnym, wykorzystując do tego opcjonalny przełącznik /S i podając nazwę docelowego komputera. Chcąc uruchomić to polecenie w kontekście innego użytkownika korzystamy z kolei z pary przełączników /U oraz /P, po których wstawiamy odpowiednio nazwę użytkownika w danej domenie oraz stosowane przez niego hasło.

Najprostsza składnia polecenia TaskKill może prezentować się następująco:

taskkill /pid 4978

lub

taskkill /im notepad.exe

W pierwszym przypadku proces, który chcemy zneutralizować określamy za pomocą jego identyfikatora - ten odczytać możemy w kolumnie Identyfikator PID w zakładce Szczegóły okna Menedżera zadań. W drugim przypadku korzystamy z przełącznika /IM, który umożliwia nam podanie nazwy konkretnego obrazu procesu, w tym wypadku systemowego Notatnika.

Należy jednak zwrócić uwagę, że próba zabicia w ten sposób działającej aplikacji kończy się jedynie przesłaniem do niej żądania jej zamknięcia. Tym samym przykładowo Notatnik zapyta nas, czy chcemy przed zamknięciem dokonać zapisu edytowanego właśnie pliku. Ten dodatkowy element interakcji powoduje, że w przypadku zabijania procesów na maszynie zdalnej narzędzie TaskKill domyślnie działać będzie z przełącznikiem /F, wymuszającym bezwzględne zakończenie procesu - czyli takie, które może narazić nas na utratę wszystkich jego niezapisanych danych roboczych. Przełącznik ten jest w tym wypadku obowiązkowy, gdyż w przeciwnym razie komputer zdalny, zamiast odblokować z zawieszonej aplikacji, pozostawilibyśmy z zapytaniem o zapis ulotnych danych.

Chcąc natomiast zakończyć w ten sposób proces na komputerze lokalnym musimy zastosować przełącznik force w sposób jawny, jak w poniższym przykładzie:

taskkill /f /im word.exe

Zanim przejdziemy do sedna tego artykułu, wspomnimy jeszcze, że przełącznikiem /T możemy zakończyć zarówno sam proces, jak i wszystkie uruchomione przez niego procesy podrzędne.

Najważniejszym elementem narzędzia TaskKill jest jednak rozbudowany mechanizm filtrowania, pozwalający nam dokładnie określić, które z procesów mają zostać zneutralizowane. Przykładowo stosując przełącznik /FI i korzystając z filtru STATUS możemy w prosty sposób pozabijać w systemie wszystkie procesy, których aktualny status brzmi Nie odpowiada. Oto przykład:

taskkill /f /fi "STATUS eq NOT RESPONDING" /im *

W powyższym przykładzie (w którym to możemy całkowicie pominąć ostatni przełącznik) korzystamy z operatora gwiazdki, który standardowo już symbolizuje wszystkie możliwe ciągi znaków. Co ważne, operator ten dostępny jest tylko i wyłącznie w przypadku zdefiniowania jakiegokolwiek filtra. Pozostałe stany procesów to RUNNING (działa) oraz UNKNOWN (nieznany). W podobny sposób działają też pozostałe filtry, do których zaliczyć można filtr przyjmujący nazwę obrazu IMAGENAME, filtr przyjmujący nazwę procesu PID, numer sesji SESSION, czas przydziału procesora CPUTIME, wykorzystanie przez proces pamięci MEMUSAGE, nazwę użytkownika będącego właścicielem procesu USERNAME, nazwę modułu DLL MODULES, nazwę usługi SERVICES oraz tytuł należącego do procesu okna WINDOWTITLE. Wszędzie tam, gdzie istnieje możliwość wskazania wartości liczbowej możemy filtrować w oparciu o operatory eq, ne, gt, lt, ge, le, które odpowiadają operatorom matematycznym =, !=, >, <, >= oraz <=. w Pozostałych przypadkach możemy jedynie porównywać wartości wykorzystując operatory eq oraz ne.

Warto zapoznać się z szerszym działaniem tego narzędzia, by w przyszłości, w razie ewentualnych problemów z aplikacjami, móc szybko pozbyć się wadliwych procesów, nie nadszarpując przy tym stanu całego systemu. Co więcej, jeśli napotykamy na takie problemy dość często, możemy sobie w prosty sposób zakodować przygotowane uprzednio polecenie w prostym pliku wsadowym .BAT i szybko wywoływać go w razie ewentualnej potrzeby.

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia