Бесплатные инструменты для подготовки списков и удаленного завершения процессов

В статье «PsExec», опубликованной в предыдущем номере журнала, было описано, как использовать один из 11 инструментов комплекта Sysinternals PsTools. На этот раз мы остановимся на двух утилитах из этого комплекта, которые превосходно работают вместе, — PsList и PsKill. PsList распечатывает информацию об активных процессах в системе, а с помощью PsKill можно завершать процессы. Все утилиты PsTools представляют собой консольные приложения, которые работают на удаленных машинах так же успешно, как и на локальных компьютерах, не требуют установки на удаленных системах вручную и совместимы с Windows NT 4.0 и более поздними версиями операционной системы. Загрузить эти инструменты можно бесплатно с сайта http://www.sysinternals.com.

PsList

Существует несколько запускаемых из командной строки утилит для подготовки списков процессов в системах на базе NT, каждая со своими возможностями. Например, Tlist поставляется вместе с пакетом Support Tools for Windows 2000, а также Debugging Tools for Windows Server 2003 и Windows XP, но не располагает функциями удаленного запуска и выдает ограниченную информацию о процессе. Инструмент Tasklist поставляется в составе XP. Он выдает больше информации и работает дистанционно, но несовместим с NT и Windows 2000. Несколько инструментов имеется в комплектах ресурсов Windows 2003 и Windows 2000, но им свойственны такие же недостатки.

PsList работает в смешанных средах и предоставляет подробную информацию о процессах, которую нельзя получить с помощью других инструментов. На экране 1 приведены сведения об использовании инструмента. Для запуска PsList административная учетная запись не требуется. Если учетная запись, от имени которой запущена утилита, на удаленной машине недействительна, то с помощью ключей -u и -p в командной строке можно указать другие имя пользователя и пароль.

Если запустить PsList без параметров настройки, система выдаст список активных процессов со статистическими данными для каждого из них. На экране 2, слева направо, приведены ID процесса, приоритет, число потоков, число дескрипторов, выделенный размер частной виртуальной памяти, занимаемое время процессора, время работы. Слишком большое количество дескрипторов, увеличенный размер частной виртуальной памяти или длительное время работы процессора могут указывать на некорректное выполнение программы. Время запуска процесса поможет связать процесс с его причиной, например с регистрацией пользователя.

С помощью трех ключей (-m, -d и -x) можно получить различные типы информации о процессе. Ключ -m выдает подробные сведения об использовании виртуальной и физической памяти. PsList выдает данные об общем объеме виртуальной памяти (разделяемой и частной), занимаемой процессом, размере физической памяти, назначенной процессу, частной виртуальной памяти, выделенной процессом, максимальном объеме выделенной частной памяти, числе ошибок страниц и страничном и нестраничном пуле, выделенном процессом.

Утечка памяти почти всегда происходит из-за того, что процесс занимает и не освобождает частную виртуальную память; данный ресурс должен сохраняться в страничном файле и потому конечен. У процессов, допускающих утечку, размер частной виртуальной памяти, как правило, постоянно растет, а размер потребляемой памяти почти всегда находится вблизи значения выделенной памяти. Назначаемый по умолчанию размер памяти Task Manager характеризует физическую память, потребляемую процессом (не виртуальную память), и не дает правильного представления об утечке памяти.

Ключ -d показывает подробные данные о потоках внутри процессов, в том числе переключениях контекста, выполненных потоком, состоянии потока (например, активен или ожидает) и времени центрального процессора, занимаемом процессом. И наконец, ключ -x выдает подробную информацию о процессе, памяти и потоке.

Полезен также ключ -t, при использовании которого PsList выдает древовидный список процессов (экран 3). Дерево процессов представляет собой структуру, которая формируется при создании процессов другими процессами; процессы, находящиеся непосредственно под другим процессом и показанные с отступом на несколько позиций вправо, являются потомками другого процесса. Рассматривая процессы в древовидном формате, легче понять их назначение. Например, все процессы, которые являются потомками SERVICES (Service Control Manager), обеспечивают работу служб Windows. На экране 3 показаны процессы-потомки, перечисленные с отступами под процессом SERVICES.

Динамическое обновление

Статическое представление всех процессов в системе может понадобиться для аудита или просто для сбора сведений о происходящем в машине; но, как правило, более полезно динамическое представление. При использовании ключа -s PsList обновляет информацию со стандартной частотой один раз в секунду; частоту обновления можно поменять с помощью ключа -r. Если применить только ключ -s или только ключи -s и -r без дополнительных параметров, PsList выдаст список активных процессов, рассортированный по времени использования процессора. Таким образом, PsList превращается в упрощенный инструмент Task Manager. PsList вычисляет коэффициент использования процессора, сравнивая два последовательных результата, поэтому значение в соответствующем столбце появляется только после завершения первого цикла обновления данных. Чтобы выйти из PsList и вернуться в командную строку, следует нажать клавишу Esc.

Стандартный режим с ключами -s или -s и -r позволяет выявить процессы, потребляющие слишком много ресурсов процессора, но если есть подозрение, что процесс дает утечку памяти, следует применять -s в сочетании с ключом -m. Эта комбинация ключей сортирует процессы по размеру выделенной им частной виртуальной памяти. На экране 4 показано, как с помощью PsList обнаружить процессы, допускающие утечку памяти. Значение частной виртуальной памяти процесса Leakyapp со временем росло, и в данный момент оно равно максимальной величине частной виртуальной памяти.

Если вместо мониторинга деятельности процессов нужно получить список процессов, отражающий использование центрального процессора, то следом за ключом -s следует поставить 2, указав число секунд, в течение которых будет работать PsList:

pslist emote s 2

Чтобы вычислить коэффициент использования процессора, двух секунд достаточно. Если переслать результаты команды в файл для архивирования, то в нем появятся два «моментальных снимка» процесса; второй «моментальный снимок» показывает список процессов, упорядоченный по коэффициенту использования центрального процессора.

Поиск процесса

Наряду с другими параметрами командной строки PsList можно указать имя или ID процесса. Например, если есть подозрения, что процесс с именем Leakyapp допускает утечку памяти, можно ввести команду

pslist emote s leakyapp

и наблюдать за изменениями в выделяемой процессу частной виртуальной памяти. Особенностями поведения PsList в отношении процессов можно воспользоваться, чтобы составить командные файлы, которые выполняют операции в зависимости от того, активен ли процесс: PsList выдает код ошибки 0, если обнаруживает процесс, имя или ID которого совпадают с указанными пользователем; в противном случае выдается код ошибки 1.

Как работает PsList

Мне нужно, чтобы PsList работал с NT 4.0, поэтому инструмент не может использовать Windows Management Instrumentation (WMI) так же, как Tasklist. PsList работает с Performance API, тем же самым API, который используется инструментом Performance Monitor. Performance API поддерживает удаленный интерфейс управления, поэтому PsList не требует установки специального программного обеспечения на контролируемых удаленных машинах. К сожалению, с помощью Performance API не удается собрать всю информацию, доступную через WMI, и, в отличие от Tasklist, PsList не может получить имя учетной записи, с которой запущен процесс, или список DLL, загруженных в процесс.

PsKill

Часто при просмотре активных процессов у администратора возникает желание остановить какой-нибудь из них. Это можно сделать с помощью утилиты PsKill. Инструмент получает имя или ID процесса и завершает все соответствующие этому условию процессы на указанной машине.

В отличие от PsList, для PsKill требуется учетная запись с административными полномочиями на целевой машине. Это условие связано с тем, что в ходе дистанционной работы PsKill, как и утилита PsExec, извлекает службу из исполняемого образа и копирует ее на удаленную машину через разделяемый ресурс admin$, запускает службу, посылает указания относительно завершаемого процесса и останавливает и удаляет службу после выполнения команды. При необходимости можно задать другие учетные данные с помощью ключей -u и -p.

Марк Русинович (mark@sysinternals.com) — редактор Windows & .NET Magazine, автор многих популярных утилит для Windows, в том числе Process Explorer и Regmon