Бывает, что программа замирает посреди работы: окно белеет, курсор превращается в бесконечное колечко, а в заголовке появляется приписка "не отвечает". Привычная реакция - вызвать Диспетчер задач и снять проблемную задачу. Но порой не открывается и он. Сочетание клавиш молчит, окно мелькает и гаснет, а интерфейс висит так же прочно, как и сама программа. Для такого случая в Windows припасён запасной ход, который не зависит от графической оболочки, - консольная утилита taskkill. Она лежит в системной папке, весит совсем немного и понимает десятки вариантов запуска. Одна короткая строка в консоли, и процесс завершён, даже если окно давно перестало откликаться на любые щелчки.

Почему консоль справляется с зависанием там, где графический Диспетчер задач бессилен

Диспетчер задач - такая же графическая программа, как и всё остальное: файл taskmgr.exe, окно, прорисовка, обработка кликов. Когда системе не хватает оперативной памяти, диск захлёбывается обращениями или зависла оболочка explorer.exe, ему приходится пробиваться через ту же очередь, в которой застряли остальные. Командная строка живёт иначе. Процесс cmd.exe крошечный, окно у него простое, текстовое, а сама утилита taskkill.exe вообще ничего не рисует: получает параметры, обращается к системе и сразу выходит. На такую работу нужно на порядок меньше ресурсов.

Утилита давно прижилась. Она пришла на смену старому инструменту kill из набора ресурсов Windows и одинаково работает и в классической командной строке, и в PowerShell.

Остаётся открыть консоль, когда мышь уже не слушается. Первый путь - нажать Win+R, ввести cmd и подтвердить не обычным Enter, а сочетанием Ctrl+Shift+Enter: консоль запустится сразу с правами администратора. Второй путь - меню на Win+X, где есть пункт с терминалом или PowerShell от имени администратора. Третий - строка поиска рядом с кнопкой "Пуск". Права администратора нужны не всегда, но без них утилита нередко отвечает отказом в доступе, так что лучше подготовиться заранее.

Из чего состоит синтаксис taskkill и что на самом деле делают ключи /im, /pid и /f

Полная схема команды выглядит громоздко:

taskkill [/s компьютер [/u домен\пользователь [/p пароль]]] {[/fi фильтр] [/pid код | /im имя]} [/f] [/t]

Без квадратных скобок и редких вариантов остаётся короткий скелет из двух решений: что завершить (ключ /im или /pid) и как это сделать (с ключом /f или без него).

Ключ /im принимает имя образа, то есть имя исполняемого файла вместе с расширением. Команда taskkill /im notepad.exe завершит все запущенные Блокноты сразу, сколько бы окон ни было открыто. Без расширения утилита лишь разводит руками: имя "notepad" ей ничего не говорит. Регистр букв значения не имеет, а если в имени встречаются пробелы, его берут в двойные кавычки.

Ключ /pid работает точнее. Числовой идентификатор принадлежит одному-единственному процессу, так что промахнуться почти невозможно: taskkill /pid 9764. Через /pid можно перечислить сразу несколько целей: taskkill /pid 1230 /pid 1241 /pid 1253.

Теперь самое интересное, ключ /f. Без него утилита лишь вежливо просит программу закрыться, ровно так же, как щелчок по крестику в углу окна. Здоровая программа на просьбу откликнется. Зависшая промолчит, потому что именно обработка таких сообщений у неё и остановилась. Поэтому обычный вызов на замершем окне нередко выдаёт сообщение об успешной отправке сигнала завершения, а окно остаётся на экране как ни в чём не бывало. С ключом /f просьба превращается в приказ: система обрывает процесс, не дав ему сохранить файлы, закрыть соединения и прибраться за собой. Цена известна: всё, что не было записано на диск, пропадёт.

Отсюда и логика. Сначала простой вызов, чтобы у программы остался шанс сохраниться. Если окно не отреагировало, добавляется /f:

taskkill /f /im notepad.exe

Как найти нужный процесс командой tasklist и отобрать зависшие программы фильтрами без ручного поиска PID

Чтобы завершить именно то, что нужно, требуется знать имя образа или PID. Здесь выручает парная утилита tasklist. Сама по себе она выводит таблицу: имя образа, PID, имя и номер сеанса, объём занятой памяти в килобайтах. Строк обычно набегает больше сотни, и читать весь список неудобно.

Удобнее сразу сузить выдачу. Ключ /v добавляет столбцы со статусом, именем пользователя и заголовком окна. Вызов tasklist /fi "status eq not responding" оставит только процессы, которые система сама считает зависшими. А чтобы найти программу по куску названия, подойдёт связка с findstr: tasklist | findstr /i word. Ключ /i отключает различие регистров.

Результат выглядит примерно так:

Имя образа                     PID Имя сессии     № сеанса       Память
========================= ======== ================ ======== ============
winword.exe                   9764 Console                 1   412 836 КБ

Для общих процессов вроде svchost.exe, внутри которых работает сразу несколько служб, пригодится ключ /svc: он показывает, какие именно службы спрятаны в каждом экземпляре. Завершать такой процесс вслепую не стоит.

Про PID нужно помнить одну особенность. Номер выдаётся при запуске программы и действует, пока она жива. После завершения система освобождает его и со временем отдаёт другому процессу. Поэтому идентификатор, подсмотренный десять минут назад, мог уже достаться совсем другой программе. Перед каждым завершением по PID список лучше обновить свежим вызовом tasklist.

Фильтр - это строка в двойных кавычках из трёх частей: поле, оператор и значение. Операторов шесть: eq (равно), ne (не равно), gt (больше), lt (меньше), ge (больше или равно), le (меньше или равно). Для текстовых полей годятся только eq и ne, а числовые допускают все шесть.

Полей у фильтра десять: STATUS (принимает значения RUNNING, NOT RESPONDING и UNKNOWN), IMAGENAME, PID, SESSION (номер сеанса), CPUTIME (процессорное время в формате чч:мм:сс), MEMUSAGE (память в килобайтах), USERNAME, MODULES (имя подгруженной библиотеки), SERVICES и WINDOWTITLE (заголовок окна). Этого хватает, чтобы описать почти любую нужную цель по её приметам.

Самая востребованная команда из всего набора умещается в одну строку и обходится без PID:

taskkill /f /fi "status eq not responding"

Она завершает всё, что система пометила как не отвечающее. Остальные примеры показывают, как мыслит фильтр:

taskkill /f /fi "windowtitle eq Безымянный*"
taskkill /f /fi "memusage gt 1000000" /im winword.exe
taskkill /f /fi "cputime gt 00:30:00" /im excel.exe

Первая команда закрывает окна по началу заголовка, звёздочка в значении заменяет любое продолжение. Вторая выбирает экземпляры Word, занявшие больше миллиона килобайт, то есть около гигабайта памяти. Третья добирается до процессов Excel, которые успели израсходовать больше получаса процессорного времени.

Несколько ключей /fi в одной команде работают как логическое "и": процесс должен подойти под все условия сразу. Имя образа при использовании фильтров можно вообще не указывать. Звёздочка в ключе /im допускается только вместе с фильтром, иначе утилита её отвергнет.

С фильтром STATUS связана тонкость. Статус "не отвечает" вычисляется для программ с окном: система следит, обрабатывает ли окно сообщения. Фоновые процессы без окон нередко показываются как UNKNOWN, так что зависшая служба этим фильтром не поймается.

Дерево процессов, права администратора и ошибки, которые встречаются чаще всего

Многие программы запускают помощников. У браузеров и офисных пакетов процессов бывает по десятку, и роль каждого в общей картине неочевидна. Ключ /t завершает указанный процесс вместе со всеми дочерними:

taskkill /pid 2134 /t /f

Незаменим он тогда, когда родитель и потомки носят разные имена и вызов по одному имени оставил бы хвосты.

Самая частая жалоба утилиты - отказ в доступе. Причины две: процесс принадлежит другому пользователю или системе, либо консоль запущена без прав администратора. Лечится обычно перезапуском консоли от имени администратора. Если и это не помогло, процесс защищён самой системой или программой, например самозащитой антивируса, и закрывать его надо штатными средствами этой программы. А если за процессом стоит служба, правильнее остановить её командой net stop имя_службы.

Вторая по частоте жалоба - сообщение, что процесс не найден. Виновники обычно банальны: опечатка в имени, забытое расширение .exe или программа, которая успела закрыться сама, пока набиралась команда.

Есть процессы, которые трогать нельзя. Остановка csrss.exe, wininit.exe, smss.exe или winlogon.exe ведёт к аварийному завершению работы системы с синим экраном. Часть из них утилита защищает отказом в доступе, но рассчитывать на это не стоит.

Особняком стоит explorer.exe. Рабочий стол, панель задач и меню "Пуск" принадлежат ему, и когда они замирают, его перезапуск считается стандартным лекарством. Тонкость в том, что после его завершения комбинация Win+R перестаёт работать, а вернуть панель обратно уже нечем. Поэтому обе команды отправляются одной строкой:

taskkill /f /im explorer.exe & start explorer.exe

Знак & в классической консоли связывает команды в цепочку. В PowerShell для этого служит точка с запятой. Панель задач исчезнет на секунду-другую и появится вновь, уже живая.

Для сценариев полезно знать про код возврата. После успешного завершения переменная %errorlevel% равна нулю, любое другое значение сигнализирует о проблеме. На этом строятся проверки внутри пакетных файлов.

Готовые сценарии, ярлык для зависших программ и привычки, которые страхуют от лишнего вреда

Если зависания случаются регулярно, команду стоит превратить в кнопку. На рабочем столе создаётся новый ярлык, в поле расположения вписывается строка taskkill.exe /FI "STATUS eq NOT RESPONDING" /F, а имя выбирается любое, например "Снять зависшее". Затем в свойствах ярлыка, на вкладке с дополнительными параметрами, включается запуск от имени администратора. После этого один двойной щелчок убирает все не отвечающие программы, и консоль даже не приходится открывать.

Мощь фильтров требует осторожности. В справочных примерах встречается команда taskkill /f /fi "PID ge 1000" /im *, которая затрагивает все процессы с номером от тысячи и выше. Это почти всё, что запущено пользователем, включая explorer.exe и несохранённые документы. Показывают её как образец того, чего делать не следует.

Простая привычка защищает от такой беды. Любое массовое условие сначала проверяется в tasklist, с теми же самыми фильтрами. Если список показывает только то, что действительно собирались закрыть, слово tasklist заменяется на taskkill и добавляется /f. Разница в одном слове, а риск ошибиться падает кратно.

Рабочий порядок действий при зависании обычно укладывается в шесть шагов:

  1. открыть консоль от имени администратора через Win+R с подтверждением по Ctrl+Shift+Enter или через меню Win+X;
  2. вывести зависшие процессы командой tasklist с фильтром по статусу, чтобы увидеть имена и PID;
  3. выполнить taskkill без ключа /f, чтобы у программы остался шанс сохранить данные;
  4. при отсутствии реакции повторить команду с ключом /f;
  5. для программ с множеством помощников добавить ключ /t;
  6. проверить результат повторным вызовом tasklist.

Эта последовательность спасает и в тех случаях, когда интерфейс системы совсем не слушается: десять-пятнадцать секунд набора заменяют долгое ожидание и принудительную перезагрузку кнопкой питания.

Чем taskkill можно заменить в PowerShell и как завершать процессы на другом компьютере сети

У taskkill есть родные аналоги. В PowerShell работает командлет Stop-Process:

Stop-Process -Name notepad -Force
Stop-Process -Id 9764 -Force
Get-Process | Where-Object { -not $_.Responding } | Stop-Process -Force

Первая строка завершает процесс по имени (расширение указывать не нужно), вторая - по идентификатору, а третья ищет все не отвечающие процессы и завершает их одним конвейером. Ключ -Force играет ту же роль, что и /f. Для тех, кому ближе язык объектов, это удобнее: свойства процессов можно сортировать, фильтровать и считать.

Есть и старая утилита tskill. Она принимает имя процесса без расширения, но возможностей у неё заметно меньше, и фильтров, например, нет вовсе.

Ключи /s, /u и /p превращают taskkill в инструмент для сети. Ключ /s задаёт имя или IP-адрес удалённого компьютера, /u добавляет учётную запись, а /p передаёт её пароль. Ключ /u работает только вместе с /s. Пример:

taskkill /s srvmain /u maindom\hiropln /im notepad.exe /f

Если пароль в команде не указать, утилита запросит его сама, и в истории консоли он не останется. Для обращения к удалённой машине действует ограничение: фильтры STATUS и WINDOWTITLE с ключом /s не поддерживаются, так что зависшие программы на другом компьютере придётся искать по имени или по PID.

Диспетчер задач - это окно, которое тоже способно зависнуть. Консольная утилита от этой слабости свободна. Достаточно помнить четыре ключа - /im, /pid, /f и /fi, - и на любое зависание найдётся ответ в одну строку. А привычка сначала смотреть в tasklist, а уже потом действовать через taskkill, сбережёт и нервы, и несохранённые документы.