A myslím tým naozaj nejdú, pričom aj ten váš super program KILLER2000 bude na ne prikrátky. Pozrime sa spolu na to, ako tieto veci vlastne fungujú, prečo k tomu dochádza a možno sa pritom dozviete o fungovaní a opravách Windows aj mnoho užitočných vecí.

Každý skúsenejší používateľ počítača sa s tým už stretol. Program spadne a nejde znova spustiť, alebo sa skrátka zasekne a zamrznutý na obrazovke prestane reagovať.

Keďže nie ste včerajší, pomocou klávesovej skratky CTRL+SHIFT+ESC spustíte Správcu úloh a na záložke Podrobnosti nájdete konkrétny proces daného problematického programu, ktorý kliknutím násilne ukončíte.

Väčšinou sa tak stane, ale nie vždy. Niekedy takéto „zabitie“ na oko prebehne, ale proces stále v zozname visí akoby sa nechumelilo, alebo samotný proces ukončenia ani neprebehne a zobrazí sa správa o nedostatočných oprávneniach, aj napriek tomu že ste administrátor.

Aj keď sa rôznymi postupmi napokon proces často darí ukončiť, v niektorých prípadoch toto násilné zabitie skrátka vôbec nie je možné (za behu systému), nech sa o to snažíte akokoľvek.

A nebojte sa, nie je to vaša chyba a ani vaša neznalosť.

PREČO SA NIEKTORÉ PROCESY DAJÚ NÁSILNE UKONČIŤ A INÉ NIKDY NEDAJÚ

RÝCHLA ODPOVEĎ: Windows pri správnej inštrukcii obvykle dokáže násilne ukončovať akýkoľvek tvrdohlavý proces, pričom roztrhá spoľahlivo všetky jeho vlákna, jeho naviazanie na zdroje a uvoľní bezpečne celý jeho adresný priestor. Problém nastáva vtedy, ak sa procesu zaseknutia účastní chybne naprogramovaný ovládač, ktorý z dôvodu nekončeného čakania na signál neposkytne údaje o adresnom priestore, ktorý treba uvoľniť a systému nezostane nič iné, než donekonečna čakať takisto.

KOMPLETNEJŠIA ODPOVEĎ S PRÍBEHOM:
Ak vám z rýchlej odpovede nie je všetko hneď jasné, nebojte sa. Všetko si zrozumiteľne vysvetlíme. V prvom rade však už navždy opustite chybnú predstavu, že úplne každý proces je možné za behu systému ukončiť, pričom ak vám to nejde, na vine je vaša neschopnosť, alebo „slabosť“ postupu, ktorý používate.

Niektoré procesy sa z princípu za jazdy ukončiť skrátka nedajú, pokiaľ nechceme systém poslať do pádu, alebo vyvolať jeho nespoľahlivosť a nestabilitu. Existujú pravdaže rôzne príčiny zaseknutia a blokovania procesu, pričom rozličné postupy ich násilného ukončenie sú rozdielne agresívne a teda aj efektívne.

V základe nie je nutné vyhľadávať na tieto účely programy tretích strán, pretože všetky používajú len prostriedky a metódy samotného operačného systému, ktoré je možné vyvolať buď v príkazovom riadku, alebo v rámci grafického rozhrania systému či administrátorských utilít od Microsoftu.

Ide o systémovú funkciu TerminateProcess (processthreadsapi.h), ktorú môžete priamo v rámci grafického rozhrania systému Windows zavolať v rámci Správcu úloh, ktorý aktivujete klávesovou skratkou CTRL+SHIFT+ESC.

Na jeho karte Podrobnosti stačí vybrať konkrétny proces a pravým tlačidlom myši vybrať možnosť Ukončiť úlohu. Takýmto spôsobom môžete ukončiť akýkoľvek proces programu alebo akýkoľvek nekľúčový systémový proces.

Obmedzením tohto vstavaného nástroja je, že vám z dôvodu bezpečnosti chodu systému neumožní svojvoľne vyslať príkaz na násilne ukončenie aj tých kľúčových systémových procesov. To je vzhľadom na jeho dostupnosť všetkým typom používateľov značne vhodné.

Toto bezpečnostné obmedzenie môžete prekonať tým, že terminačný mechanizmus vyvoláte manuálne v príkazovom riadku. A to buď príkazom:

Taskkill /IM NázovProcesu.exe /F

Alebo alternatívne aj príkazom:

WMIC process where "name='NázovProcesu.exe'" delete

Obe tieto metódy, teda aj Taskkill s násilným „force“ parametrom (/F) a aj zmazanie procesu v rámci Windows Management Instrumentation (WMI), interne narábajú so systémovou funkciou TerminateProcess. Líšia sa však spôsobom ako s ňou operujú v rámci systému, pričom s tou druhou metódou budete častejšie úspešnejší na systémoch, kde máte problém získať na konkrétny proces dostatočné oprávnenia. S plnými administrátorskými právami bude však výsledok oboch metód totožný.

Používanie konzolových príkazov je pravdaže značne nepohodlné, obzvlášť ak v niektorých prípadoch budete mať problém získať správny názov procesu alebo jeho PID (procesný identifikátor). Omnoho vhodnejšie je preto namiesto nich používať pokročilú administrátorskú utilitu Process Explorer, ktorú Microsoftu poskytuje zdarma v rámci balíku nástrojov Sysinternals.

Treba upozorniť, že podobne ako vyššie uvedené konzolové príkazy, aj Process Explorer vám v tejto súvislosti dáva plnú moc. Kým obyčajný Správca úloh (CTRL+SHIFT+ESC) vám nedovolí násilne ukončiť kľúčové systémové procesy, bez ktorých hrozí pád alebo zlá funkcia systému, Process Explorer takéto limity nemá a na vašu požiadavku ukončí čokoľvek.

Spolu s tým vám poskytuje aj značne robustné reporty o daných procesoch ako takých a umožní vám vyhľadávať a ukončovať aj ich naviazanosti, či preberať k nim práva, potrebné na ich ukončenie v neadministrátorskom prostredí. Ide skrátka o „Správcu úloh“ pre administrátorov a pokročilých používateľov.

ČO SA TEDA PRI UKONČOVANÍ DEJE?

Keď vyvoláte násilné ukončenie konkrétneho procesu, termináčný mechanizmus zaháji jeho postupné vystrihávanie zo systému. V základe sa násilne a neodkladne ukončujú úplne všetky vlákna, ktoré má proces na seba naviazané a dochádza takisto k prerušovaniu spojení a odkazov na k nemu naviazané systémové prostriedky. Ide teda o prestrihávanie všetkých jeho programových rukovätí (handles) smerujúcich na konkrétne súbory, kľúče systémové registru a podobne, v rámci čoho sa kompletne búra celý ním alokovaný adresný priestor.

Je dôležité si uvedomiť, že systémový procesný terminátor je celkom nemilosrdný a nekompromisný. Cieľový program nedostáva žiadnu informáciu o tom, že je ukončovaný a nemá ani žiadnu možnosť sa proti tomuto procesu brániť alebo naň reagovať. Nijako sa ho neúčastní.

PREČO TEDA NIEKTORÉ PROCESY ANI ZA SVET NEJDE UKONČIŤ?

Obvykle ide o dôsledok chyby v nevhodne navrhnutom ovládači, ktorý nedokáže správne reagovať na jasný príkaz ukončenia nevybavenej vstupno-výstupnej požiadavky (I/O request).

Inak povedané, samotný Windows všetko robí správne a previnilý proces ukončuje nemilosrdne tak ako je treba, avšak vidí, že s procesom naviazal komunikáciu aj ovládač tretej strany. Z dôvodu chyby vo svojom kóde ovládač pritom nedokáže na situáciu správne reagovať a zostane navždy čakať na signál, ktorý nikdy nepríde.

Pre ilustráciu bez komplexných technických detailov si to ukážme na rozhovore, pri ktorom OVLÁDAČ plní rolu vrátnika haly a jeho šéf v podobe WINDOWS na neho kričí z okna vedľajšej kancelárie riaditeľa.

  • WINDOWS: Povedz mi koľko škatúľ je nanosených v hale.
  • OVLÁDAČ: Do haly stále nosia skladníci ďalšie škatule, hneď ako ich donosia, oznámim konečný stav.
  • WINDOWS: Všetci skladníci už odišli, fabrika je zavretá, povedz mi koľko škatúľ je v hale.
  • OVLÁDAČ: Áno, hneď ako posledný skladník odíde dverami, poviem to.
  • WINDOWS: Žiadny skladník už dverami neprejde. Fabrika je prázdna. Povedz mi stav skladu.
  • OVLÁDAČ: Zazvonil som signál aby skladníci odišli z haly a prestali nosiť. Hneď ako odídu, oznámim celkový počet škatúľ.
  • WINDOWS: Nikto už nikdy z haly neodíde, všetci sú preč. Povedz mi súčasný počet škatúľ.
  • OVLÁDAČ: Áno, rozumiem, nikto už nepríde. Za malý okamih odíde ten posledný skladník čo tu bol a hneď potom odpoviem.

Nuž a ovládač čaká na to „dovidenia“ od posledného skladníka donekonečna a systému potrebné údaje nikdy neprezradí. Aj keď Windows dokáže neposlušný ovládač reštartovať a znovu ho zaviesť aj počas behu systému, robí to len v prípade, ak ovládač úplne prestane odpovedať/reagovať (zamrzne).

Typicky to môžete vidieť napríklad v momente, keď pri hraní náročnej hry váš displej na sekundu sčernie a následne sa znovu zapne, pričom hra môže ale aj nemusí pokračovať v behu. To je práve moment, kedy Windows rozpoznal, že grafický ovládač sa zasekol/zamrzol a okamžite ho bleskovo reštartuje a znovu zavedie do behu, v snahe udržať všetko v chode.

V prípade problému s neukončiteľným procesom je ale ovládač stále funkčný a so systémom komunikuje. Takisto plní bez problémov aj úlohy pre iné otvorené procesy, ktoré ho potrebujú. Windows ho teda nereštartuje a nelikviduje celý jeho adresný priestor, pretože by tým ovplyvnil aj iné procesy, ktoré fungujú bez problémov.

Ak chcete vidieť, ako takýto scenár vyzerá v realite, môžete si to vyskúšať vďaka nástroju NotMyFault (v preklade, To Nie Je Moja Chyba), ktorý vyvinul Mark Russinovich, vývojár Microsoftu, ktorý okrem iného stvoril aj súpravu administrátorských utilít Sysinternals, kde patrí aj Process Explorer a ďalšie pokročilé nástroje.

NotMyFault je utilita, ktorá demonštruje niekoľko typov najčastejších bugov ovládačov, ako napríklad pretečenie pamäte vedúce k pádu systému, pričom obsahuje aj „schopnosť“ visieť na existujúcej vstupno-výstupnej požiadavke (tzv. I/O request), pri ktorej ovládač donekonečna čaká na paket, ktorý nikdy nepríde.

Ak si stále myslíte, že poznáte nejaký zaručený postup, alebo super-uber program, ktorý dokáže za behu systému násilne ukončiť akýkoľvek proces, nech sa páči, vyskúšajte. Maličkú utilitu stačí spustiť a na jej záložke „Hang“ vybrať „Hang with IRP“. Následne sa pokúste proces utility nejako ukončiť (čo sa vám nepodarí).

To čo sa stane je, že utilita odošle I/O request do driveru svojho pomocníka (súbor Myfault.sys, teda MojaChyba.sys) a prestane reagovať. Keďže tento ovládač zámerne obsahuje bug, ktorý s touto situáciou nepočíta, bude čakať na otvorenom komunikačnom kanále donekonečna.

Varovanie: Demonštračná utilita NotMyFault od Microsoftu dokáže na váš príkaz cielene vyvolať reálne pády a záseky systému. Nepoužívajte ju pri rozrobenej práci, alebo v súvislosti s príkazmi, ktorým nerozumiete.

Celý proces môžete vidieť aj na vlastné oči v rámci Process Exploreru, ktorý umožňuje zobraziť kroky jednotlivých vlákien. Pozrime sa teda na to, čo procesný terminátor robí a prečo proces neukončí. Dvojklikom si otvorme visiaci neukončený proces NotMyFault a skontrolujme, ako proces prebiehal od otvorenia programu (tento krok si vyžaduje mať v systéme nainštalované debugovacie nástroje Microsoftu 1, 2).

V základe ide o históriu vyvolaných subrutín, ktorá sa číta od dola (najstaršie) smerom hore (najnovšie volania). Všimnite si hlavne riadok 16, 15 a 14, kde program zavolal DeviceIoControlFile a následne prešiel do módu práce s jadrom systému. Tieto záznamy už majú predponu ntoskrnl.exe.

Vidíme, ako vysiela synchrónnu požiadavku (riadok 10) a volá ovládač (9), ktorým je myfault.sys (8). Keďže táto I/O požiadavka bola synchrónna, manažér prerušení systému bude čakať na to, kým ovládač odpovie a požiadavku vybaví.

A to je práve daný problém. Ak program prestane reagovať a táto požiadavka nikdy nie je ukončená, Manažér prerušení bude čakať na túto požiadavku donekonečna, čo je vidieť na riadku 7 (KeWaitForSingleObject).

Keď systémový terminátor likviduje na vašu žiadosť spustený proces, pričom pretrháva všetky jeho vlákna a zatvára jeho naviazania na jednotlivé systémové zdroje, narazí pri tom aj na túto nevybavenú I/O požiadavku.

Keďže potrebuje zlikvidovať celý adresný priestor, ktorý proces zaberal, okamžite kontaktuje daný ovládač a nakáže mu, aby túto I/O požiadavku dokončil, respektíve zrušil. Problémom je, že niektoré ovládače to kvôli svojej chybe/neschopnosti nedokážu urobiť a  donekonečna čakajú na reakciu daného procesu programu. Systém tak nezostáva nič iné, než čakať na túto odpoveď takisto.

/Snímka z filmu Terminátor 2/

A tu je dôležité si všimnúť zaujímavý fakt. To čo je vlastne „neukončiteľné“, nie je proces programu ako taký. Windows ho „dotrhá ako noviny“ a nemá s tým absolútne žiadny problém. Dokončeniu likvidácie zabráni fakt, že chybný ovládač, ktorý s problematickým procesom daného programu drží len naviazanú komunikáciu, nepošle systému informáciu, kde presne „trhanie“ v rámci adresného priestoru pamäte treba skončiť (pretože ovládač si myslí, že komunikácia s procesom je v plnom prúde a čaká na jej koniec).

Windows nemôže likvidovať adresný priestor len tak hlava-nehlava a poškodiť s tým iné, nesúvisiace procesy v pamäti. Je to taký svedomitý terminátor, ktorý fakt chce zabiť len Johna Connora a nie niekoho iného, takže ak sa totožnosť dotyčného nepotvrdí, spúšť nestlačí. Vaša frustrácia z toho, že tvrdohlavý proces nejde ukončiť teda nejde na vrub jeho odolnosti. Windows ho z hľadiska sily dokáže ukončiť vždy, ale bohužiaľ vinou zlého ovládača nedostal presnú informáciu o tom, kde svoju silu má uplatniť.

A to je celé. Preto vám nezostane nič iné, než reštartovať celý počítač (čo doma síce nie je problém, ale v serverovom prostredí to veru nie je vždy banalita). Pri reštarte sa totiž ukončuje úplne všetko a operačná pamäť sa vyprázdni celá.

ODBLOKOVANIE PRIEČINKU, KTORÝ NEJDE ZMAZAŤ ANI PREMENOVAŤ

Na záver ešte niečo praktické, čo vám možno ušetrí mnoho času aj nervov. Problém neukončených procesov totiž často zasahuje aj do priečinkov, pričom vôbec nemusí ísť o to, že by bol nejaký proces problematický alebo zamrznutý.

Obvykle ide o celkom správnu a prirodzenú vec. Typicky, ak si napríklad rozkliknete svoj priečinok „Škola“ a následne v ňom otvoríte dokument Diplomovka.docx, ktorý sa zobrazí v programe Word, kde ho začnete prepisovať, priečinok ako taký musí byť uzamknutý.

V takomto momente musí byť zabránené tomu, aby ste priečinok nemohli presúvať alebo premenovávať, pretože otvorený dokument v ňom by ste vlastne nechcene odstrihli, pričom by mohlo dôjsť k poškodeniu samotného dokumentu alebo celého súborového systému.

Ak sa o premenovanie alebo presun pokúsite, Prieskumník Windows vám v tom zabráni a zobrazí sa jednoduchá informácia o tom, že to nie je možné, pretože sa priečinok práve používa. Dokonca vám aj zreteľne oznámi čo konkrétne je vo veci, pričom napríklad na obrázku vyššie ukazuje, že dôvodom blokovania je práve aktívne otvorený dokument programu Word.

Bohužiaľ, nie vždy je situácia takáto jasná.

Niektoré programy totiž blokujú konkrétne priečinky už svojim obyčajným spustením a samotnou existenciou, bez ohľadu na to, či s danými priečinkami a jeho súbormi vôbec niečo aktuálne robia.

Windows v takomto prípade  vôbec nie je nápomocný a skrátka len oznámi, že priečinok niečo používa/blokuje, ale už nie čo konkrétne. Táto oznamovacia funkcia je totiž naviazaná na otvorené súbory a ak žiadne otvorené nie sú, používateľ zostane v kaši.

Mnoho ľudí netuší, ako v týchto situáciách postupovať, pretože nikde nedostanú informáciu o tom, aký proces je potrebné vlastne ukončiť.

Ak vás napadne ukončiť samotného Prieskumníka (Explorer.exe) a následne ho pomocou Win+R znova spustiť, ďaleko sa nedostanete. Tento krok pomôže len vtedy, ak je problém len na jeho strane a samotné rozhranie priečinkov, Štart menu alebo spodný hlavný panel zamrzol ako celok.

Ak nejde priečinok len premenovať, zmazať či presúvať, samotný Explorer s tým obvykle nemá nič spoločné a len vám správne oznamuje situáciu, aby potenciálne nedošlo k poškodeniu súborového systému.

Inak povedané, ak vám v aute svieti kontrolka, že nie sú dobre zavreté dvere, je treba skontrolovať čo ich fyzicky blokuje a čo im bráni sa dovrieť, nie byť nahnevaný na kontrolku.

Riešenie teda je ukončiť proces, ktorý naozaj daný priečinok drží zablokovaný. A to je vlastne celé jadro pudla. Ako ale toho vinníka zistiť, keď Windows ako taký mi to neprezradí? Ako zistím, kto drží nohu vo dverách?

Našťastie, administrátorskú utilita Process Explorer, ktorú Microsoft zdarma poskytuje, je veľmi nápomocná aj v tomto prípade. Jej pokročilé monitorovanie otvorených procesov totiž umožňuje tieto natiahnuté nohy vo dverách hľadať.

Poslúži vám na to funkcia „Find Handle or DLL Substring“, ktorú nájdete na hlavnom panely programu v menu Find.

Ide o jednoduché okno, do ktorého názov inkriminovaného priečinku, alebo lepšie celú cestu k nemu (skopírovanú z adresného riadka Prieskumníka) stačí zadať.

Process Explorer následne začne prehľadávať všetky spustené procesy a kontroluje, ktorý z nich má do priečinku „natiahnuté vlákno“, ktoré bráni v jeho manipulácii. Trvá to obvykle zhruba 5 sekúnd, pričom následne zobrazí zoznam konkrétnych procesov.

Samotný Explorer.exe, teda Prieskumník Windows, ktorý sa v tomto zozname obvykle objaví, môžete ignorovať, pretože v základe ide len o prejav toho, že vám on sám blokovanie priečinku oznámi. Zaujímať vás budú tie ostatné, ktoré sa tu objavia, patriace nejakému konkrétnemu programu.

Zistený program, ktorý priečinok blokuje, pri tom obvykle nie je ani nutné ukončovať násilne. Zvyčajne je totiž plne funkčný a stačí ho klasickou cestou len zavrieť. Proces vám skrátka len umožní sa dozvedieť, ktorý program za to mohol. Typicky ide napríklad nejaký audio či video editor, alebo streamovací program, ktorý je len „pripravený“ do tohto priečinku niečo ukladať a pre istotu si ho dopredu zablokuje.

Samozrejme môže nastať aj situácia, kedy blokovanie spôsobuje program, ktorý už nemáte viditeľne otvorený (používateľské rozhranie sa zavrelo) a  jeho proces kvôli chybe zostal stále aktívny na pozadí.

Nech už ide o ten prvý alebo druhý prípad, program/proces následne zavriete alebo násilne ukončíte a priečinok je znovu voľný a môžete s ním manipulovať z hľadiska presúvania, premenovania či zmazania.

Tak snáď ste sa o fungovaní systému dozvedeli trochu viac a budete sa už na procesy a ich terminátorov pozerať v trochu inom svetle.

František Urban

František Urban
Zameriavam sa najmä na prehľadové a analytické články z oblasti najrôznejších technológií a ich vývoja. Nájdete ma takisto pri diagnostike HW a SW problémov.