Управление процессами в Linux

19.04.2019

Как вы думаете, операционная система Linux может автоматически позаботиться сама о себе? Когда работает все нормально или вам не нужны никакие нестандартные возможности — вполне да. Но иногда может понадобиться ваше вмешательство в ее работу.

В Linux для каждой отдельной программы, при ее запуске создается процесс. Неважно запускаете программу вы вручную самостоятельно или это делает система или ядро. Например, программа инициализации, которая запускается сразу после завершения загрузки ядра тоже имеет свой процесс с идентификатором 0. Процессы в linux можно описать как контейнеры, в которых хранится вся информация о состоянии и выполнении программы. Если программа работает хорошо, то все нормально, но если она зависла или вам нужно настроить ее работу может понадобиться управление процессами в Linux.

В этой статье будет затронута обширная тема, мы рассмотрим такие возможности:

  • Просмотр запущенных процессов
  • Просмотр информации о процессах
  • Поиск процессов в Linux
  • Изменение приоритета процессов
  • Завершение процессов
  • Ограничение памяти доступной процессу

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

Что такое процесс?

Начнем с того, что разберемся в терминах. По сути, процесс — это каждая программа. Как я уже говорил для каждой запускаемой программы создается отдельный процесс. В рамках процесса программе выделяется процессорное время, оперативная память и другие системные ресурсы. У каждого процесса есть свой идентификатор, Proccess ID или просто PID, по ним, чаще всего и определяются процессы Linux. PID определяется неслучайно, как я уже говорил, программа инициализации получает PID 1, а каждая следующая запущенная программа — на единицу больше. Таким образом PID пользовательских программ доходит уже до нескольких тысяч.

На самом деле, процессы Linux не настолько абстрактны, какими они вам сейчас кажутся. Их вполне можно попытаться пощупать. Откройте ваш файловый менеджер, перейдите в корневой каталог, затем откройте папку /proc. Видите здесь кучу номеров? Так вот это все — PID всех запущенных процессов. В каждой из этих папок находится вся информация о процессе.

Например, посмотрим папку процесса 1. В папке есть другие под каталоги и много файлов. Файл cmdline содержит информацию о команде запуска процесса:

cat /proc/1/cmdline

/usr/lib/systemd/systemd

Поскольку у меня используется система инициализации Systemd, то и первый процесс запускается для нее. С помощью каталога /proc можно сделать все. Но это очень неудобно, особенно учитывая количество запущенных процессов в системе. Поэтому для реализации нужных задач существуют специальные утилиты. Перейдем к рассмотрению утилит, которые позволяют реализовать управление процессами в Linux.

Управление процессами в Linux

В Linux есть очень большое количество утилит для решения различных задач по управлению процессами. Это и такие многофункциональные решения, как htop, top, а также простые утилиты, например, ps, kill, killall, who и т д. Я не буду рассматривать в этой статье графические утилиты, и top тоже рассматривать не буду. Первое потому что слишком просто, второе — потому что htop лучше. Мы остановимся на работе с программой htop и ее аналогами в форме утилит в стиле GNU, одна утилита — одна функция.

Давайте установим htop, если она у вас еще не установлена. В Ubuntu это делается так:

sudo apt install htop

В других дистрибутивах вам нужно просто использовать свой менеджер пакетов. Имя пакета такое же.

Посмотреть запущенные процессы

Это очень простая задача, и также просто она решается. Для этого существует множество утилит, начиная от обычной ps, до более продвинутых интерактивных top, htop и так далее.

Открыв htop, мы сразу видим список запущенных процессов. Конечно, здесь отображены не все процессы linux, их-то в системе очень много, вы уже знаете, все они на один экран не поместятся. По умолчанию выводятся процессы, запущенные от имени вашего пользователя:


Вы можете увидеть такую информацию о процессе:

  • PID — идентификатор процесса
  • USER — пользователь, от которого был запущен процесс
  • PRI — приоритет процесса linux на уровне ядра (обычно NI+20)
  • NI — приоритет выполнения процесса от -20 до 19
  • S — состояние процесса
  • CPU — используемые ресурсы процессора
  • MEM — использованная память
  • TIME — время работы процесса

К отображению можно добавить и дополнительные параметры, но эти главные. Добавить параметры можно с помощью меню Setup. Там все очень просто, читайте подсказки и следуйте указаниям. Например, добавлен параметр PPID:


Очень важной особенностью программы есть то, что вы можете сортировать процессы в Linux по нужному параметру. Просто кликните по названию параметра, оно выделится зеленым и будет выполнена сортировка. Например, хотите посмотреть в каком порядке запускались процессы, сортируем по PID:


Также есть интересная возможность разместить процессы в виде дерева. Вы сможете увидеть, каким процессом был запущен тот или иной процесс. Для отображения дерева нажмите кнопку F5:


Почти те же действия вы можете выполнять с помощью программы ps. Только здесь нет такого удобного интерактивного режима. Все делается с помощью опций.


Рассмотрим основные опции, которые будем использовать:

  • -e — вывести информацию обо всех процессах
  • -a — вывести информацию обо всех наиболее часто запрашиваемых процессах
  • -t — показывать только процессы из этого терминала
  • -p — показывать информацию только об указанном процессе
  • -u — показывать процессы только определенного пользователя

Одним словом, чтобы посмотреть все активные на данный момент процессы в linux, используется сочетание опций aux:

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

ps aux --sort=%mem

Список будет отсортирован в обратном порядке, внизу значения больше, вверху — меньше. Если нужно в обратном порядке, добавьте минус:

ps aux --sort=-%cpu


В качестве поля для сортировки могут быть использованы приоритеты процессов Linux или любые другие параметры. Также вы можете обрезать вывод, если не нужно выводить всю информацию:

Казалось бы, у ps нет возможности стоить деревья процессов. Но не совсем, для этого существует отдельная команда:


Поиск процессов в Linux

Список процессов, это хорошо. Но иногда, когда какой-нибудь процесс завис и нужно убить процесс Linux или нам нужно провести с ним какие-либо действия, нужно выделить этот процесс из списка, узнать его PID и информацию о нем.

Чтобы найти процесс linux в htop можно использовать кнопку F3. Нажмите F3 и наберите нужное слово. Дальше чтобы перейти к следующему вхождению нажимайте F2 или Esc для завершения поиска:


Для поиска процессов в htop можно использовать также фильтр htop. Нажмите F4, введите слово и будут выведены только процессы linux, имя которых включает это слово.


В утилите ps фильтрации нет, но зато мы можем использовать утилиту grep, перенаправив вывод ps на нее чтобы найти процесс linux:

ps aux | grep chromium

Это очень часто употребляемая команда.

Изменение приоритета процессов

Приоритет процесса linux означает, насколько больше процессорного времени будет отдано этому процессу по сравнению с другими. Так мы можем очень тонко настроить какая программа будет работать быстрее, а какая медленнее. Значение приоритета может колебаться от 19 (минимальный приоритет) до -20 — максимальный приоритет процесса linux. Причем, уменьшать приоритет можно с правами обычного пользователя, но чтобы его увеличить нужны права суперпользователя.

В htop для управления приоритетом используется параметр Nice. Напомню, что Priv, это всего лишь поправка, она в большинстве случаев больше за Nice на 20. Чтобы изменить приоритет процесса просто установите на него курсор и нажимайте F7 для уменьшения числа (увеличения приоритета) или F8 — для увеличения числа.

Но и для решения этой задачи управления процессами Linux необязательно использовать htop. Вы можете сделать все и другими командами. Например, команда nice. С помощью нее вы можете указать приоритет для запускаемого процесса:

nice -n 10 apt-get upgrade

Или изменить приоритет для уже существующего по его pid:

renice -n 10 -p 1343

Завершение процессов в Linux

Если процесс завис и не отвечает, его необходимо завершить. В htop, чтобы убить процесс Linux, просто установите курсор на процесс и нажмите F9:


Система для управления процессами использует определенные сигналы, есть сигналы, которые указывают процессу завершиться. Вот несколько основных сигналов:

  • SIGKILL — попросить процесс сохранить данные и завершится
  • SIGTERM — завершить процесс немедленно, без сохранения

Вообще сигналов есть несколько десятков, но мы не будем их рассматривать. Отправим сигнал SIGKILL:

Также можно воспользоваться утилитой kill:

Также можно уничтожить процесс по имени:

killall chromium

Ограничение процессов

Управление процессами в Linux позволяет контролировать практически все. Вы уже видели что можно сделать, но можно еще больше. С помощью команды ulimit и конфигурационного файла /etc/security/limits.conf вы можете ограничить процессам доступ к системным ресурсам, таким как память, файлы и процессор. Например, вы можете ограничить память процесса Linux, количество файлов и т д.

Запись в файле имеет следующий вид:

<домен> <тип> <элемент> <значение>

  • домен — имя пользователя, группы или UID
  • тип — вид ограничений — soft или hard
  • элемент — ресурс который будет ограничен
  • значение — необходимый предел

Жесткие ограничения устанавливаются суперпользователем и не могут быть изменены обычными пользователями. Мягкие, soft ограничения могут меняться пользователями с помощью команды ulimit.

Рассмотрим основные ограничения, которые можно применить к процессам:

  • nofile
  • as — максимальное количество оперативной памяти
  • stack — максимальный размер стека
  • cpu — максимальное процессорное время
  • nproc — максимальное количество ядер процессора
  • locks — количество заблокированных файлов
  • nice — максимальный приоритет процесса

Например, ограничим процессорное время для процессов пользователя sergiy:

sergiy hard nproc 20

Посмотреть ограничения для определенного процесса вы можете в папке proc:

cat /proc/PID/limits

Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 204800 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 23562 23562 processes
Max open files 1024 4096 files
Max locked memory 18446744073708503040 18446744073708503040 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 23562 23562 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

Ограничения, измененные, таким образом вступят в силу после перезагрузки. Но мы можем и устанавливать ограничения для текущего командного интерпретатора и создаваемых им процессов с помощью команды ulimit.

Вот опции команды:

  • -S — мягкое ограничение
  • -H — жесткое ограничение
  • -a — вывести всю информацию
  • -f — максимальный размер создаваемых файлов
  • -n — максимальное количество открытых файлов
  • -s — максимальный размер стека
  • -t — максимальное количество процессорного времени
  • -u — максимальное количество запущенных процессов
  • -v — максимальный объем виртуальной памяти

Например, мы можем установить новое ограничение для количества открываемых файлов:

Теперь смотрим:

Установим лимит оперативной памяти:

ulimit -Sv 500000

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

Выводы

Вот и все. Теперь управление процессами в Linux не вызовет у вас проблем. Мы рассмотрели очень даже подробно эту тему. Если у вас остались вопросы или есть предложения по дополнению статьи, пишите в комментариях!

Введение

Вам когда-нибудь хотелось узнать, какая программа открыла тот или иной файл или каталог? Теперь у вас есть такая возможность. Программа Process Explorer отображает информацию об открытых процессом дескрипторах и загруженных им библиотеках DLL.

Рабочая область программы Process Explorer состоит из двух окон. В верхнем окне отображается список активных процессов, включая имена учетных записей, которым принадлежат эти процессы. Информация, которая отображается в нижнем окне, зависит от выбранного режима работы программы. В режиме дескрипторов в нижнем окне отображаются все открытые дескрипторы выбранного в верхнем окне процесса, а в режиме библиотек DLL - все загруженные процессом динамические библиотеки и отображенные в память файлы. Помимо этого в программе Process Explorer также есть мощные возможности поиска, благодаря которым можно быстро узнать, у какого процесса открыт определенный дескриптор или загружена определенная библиотека DLL.

Благодаря своим уникальным возможностям, программа Process Explorer полезна для разрешения проблем с версиями библиотек DLL и утечками дескрипторов, а также для понимания принципов работы ОС Windows и приложений.


Установка

Запустите программу Process Explorer (procexp.exe).

В файле справки приводится информация о доступных операциях и об использовании программы. При возникновении вопросов или проблем посетите форум компании Sysinternals, посвященный программе Process Explorer.

Дополнительные материалы

Ниже приведен перечень других программ для отслеживания дескрипторов и библиотек DLL, доступных на веб-узле Sysinternals:

    программа для просмотра информации об открытых дескрипторах, выполняется в командной строке;

    программа для просмотра информации о загруженных библиотеках DLL, выполняется в командной строке;

    программа для вывода списка процессов на локальной или удаленной системе, выполняется в командной строке;

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

Статьи в базе знаний Майкрософт, посвященные
программе Process Explorer
В приведенных ниже статьях базы знаний Майкрософт упоминается об использовании программы Process Explorer для диагностики или устранения различных ошибок:
  • 319034: FIX: Утечка дескрипторов потока в методе PrintReport отчетов Data Report
  • 242131: Как отобразить список процессов, имеющих открытые файлы
  • 216368: PRB: Нарушение доступа во время установки приложения, если файл занят
  • 166112: PRB: Возникновение конфликта со свойством EOF при использовании директивы #import для объектов данных ActiveX
  • 301357: PRB: Библиотеки DLL не выгружаются после вызова CoFreeUnusedLibraries
  • 247957: SAMPLE: Использование программы DUPS.exe для разрешения проблем совместимости библиотек DLL
  • 313735: XCON: Утечка памяти в процессе MTA при большом количестве открытых дескрипторов
  • 276525: Компьютер перестает отвечать при отслеживании открытых дескрипторов

Установка

Просто запустите программу Process Explorer (procexp.exe).

В файле справки приводится информация об использовании программы Process Explorer и о доступных операциях. При возникновении вопросов или проблем посетите

Один из способов обнаружения вирусов на ПК - просмотр запущенных процессов в Диспетчере задач. Не всегда антивирусные программы справляются на 100% с возложенными на них задачами. Иногда приходится отлавливать вирусы вручную.

Многие вирусы скрывают своё присутствие в Диспетчере задач - они невидимы. В этом случае на помощь приходят, альтернативные диспетчера задач. Любой из них можно скачать в сети и пользоваться. Встроенный в Windows, собственный Диспетчер задач малоинформативен и скрытых процессов не показывает. Сторонние же, подобные утилиты, лишены этого недостатка и показывают скрытые процессы. Если в стандартном диспетчере нет процессов, которые отобразились в окне анализа альтернативной утилиты, то нужно уделить тщательное внимание этим процессам, возможно, это и есть вредоносные приложения. Нужно посмотреть изготовителя процесса, обычно он всегда указывается чётко и ясно, а также, сколько ресурсов потребляет этот процесс. Если много, по сравнению с другими, то это уже крайне подозрительно.

Подобный осмотр нужно делать при выключенных приложениях, что бы оставались стандартные процессы и вирусы, само собой. Лучше всего это сделать в Безопасном режиме . Очень хорошо, когда вы только установили Виндовс, сделать снимок страницы Диспетчера задач со стандартными процессами, что бы иметь возможность сравнить отличия. Снимок -имеется ввиду сохранённый файл со скрином, а не снимок фотокамерой (производится посредством нажатия кнопочки Print Screen на клавиатуре, кто не знает, как это делается, спрашивайте в комментариях).

Итак, рассмотрим стандартные процессы:

  1. Sistem - системные процессы без расширения ехе .Если такой процесс у вас с расширением - это вирус замаскировался под системный процесс.
  2. Smss.exe -процесс управляющий запуском учётных записей пользователей. Если у вас включен, в данный момент один сеанс учётной записи, а процессов Smss.exe больше - делайте соответствующие выводы.
  3. Csrss .exe . - процесс руководящий созданием окон, он должен быть, всегда один.
  4. Winlogon.exe. - отвечает за авторитарный вход пользователя в систему. Только один.
  5. Services.exe. - обеспечивает работу служб операционной системы, запускается от имени System, также один.
  6. Lsass.exe. - обеспечивает безопасность ОС, всегда один.
  7. Svchost.exe . - запуск Dll-файлов (динамически подключаемая библиотека, сюда относятся драйвера, элементы управления ActiveX ) имя пользователя: LOCAL SERVICE, NETWORK SERVICE и SYSTEM, должно быть максимум шесть.
  8. SYSTEM - отвечает за раскладку клавиатуры и языковую панель на панели задач. Должен быть один.
  9. Explorer.exe. - управляет рабочим столом (ярлыками, иконами и т.д), его интерфейсом. Запускается один раз.
  10. Spoolsv.exe. - ставит объекты в очередь на печать. Один. Нет принтера - можно и отключить, процесс не критический.
  11. Wdfmgr .exe . - отвечает за корректную работу драйвера медиа плейера, тоже не критичный процесс.
  12. Taskmgr.exe . - сам Диспетчер задач
  13. Ну и самый последний - Бездействие системы . Показывает свободные ресурсы.

В обычном режиме у вас кроме этих процессов, будут процессы запущенных приложений, драйверов. Чтобы отключить подозрительный процесс, выделяем его и нажимаем Остановить процесс.

Это дин из способов, более безопасный, чем скажем, экспериментировать с системным реестром.

Управление процессами из командной строки

Способов управлять процессами в Windows предостаточно, и командная строка занимает в них далеко не первое место. Однако иногда бывают ситуации, когда все остальные инструменты кроме командной строки недоступны, например некоторые вредоносные программы могут блокировать запуск Task Manager и подобных ему программ. Да и просто для общего развития полезно знать способы управления компьютером из командной строки.

Для управления процессами в командной строке есть две утилиты — tasklist и taskkill . Первая показывает список процессов на локальном или удаленном компьютере, вторая позволяет их завершить. Попробуем …

Если просто набрать команду tasklist в командной строке, то она выдаст список процессов на локальном компьютере.

По умолчанию информация выводится в виде таблицы, однако ключ /fo позволяет задать вывод в виде списка или в формате CSV, а ключ /v показывает более подробную информацию о процессах, например команда tasklist /v /fo list выведет подробное описание всех процессов в виде списка.


Список получится довольно большой, поэтому попробуем уточнить запрос. Для этого используем ключ /fi , который позволяет использовать фильтры для вывода данных, например команда tasklist /fi ″username eq user″ /fi ″memusage le 40000″ выводит список процессов пользователя user , которые потребляют не больше 40Мб памяти.


Найдя процессы, которые необходимо завершить, воспользуемся командой taskkill. Завершать процессы можно по имени, идентификатору процесса (PID) или задав условия с помощью фильтров. Для примера запустим несколько экземпляров блокнота (notepad.exe) и попробуем завершить его разными способами.


Ключ /f завершает процесс принудительно, а /t завершает все дочерние процессы.

Полную справку по командам tasklist и taskkill можно получить, введя их с ключом /?

Теперь пустим в ход тяжелую артиллериюPowerShell. Его можно запустить не выходя из командной строки. Для получения списка процессов используем командлет Get-Process.


Чтобы не выводить весь список процессов можем воспользоваться командлетом Where-Object , который задает фильтр для выводимой информации. Для примера выведем список процессов, которые загружают процессор и отсортируем их по возрастанию нагрузки с помощью команды:

Get-Process | where {$_.cpu -gt 0} | sort cpu


С помощью PowerShell мы можем получить любую информацию о любом процессе. В качестве примера возьмем процесс cmd и выведем список его свойств командой:

Get-Process -Name cmd | Get-Member -Membertype property


Выбираем те свойства, что нам интересны (в примере имя и ID процесса, путь к файлу, используемые модули и время запуска) и выводим их в виде списка командой:

Get-Process -Name cmd | Format-List name, id, path, modules, starttime


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

Для завершения процесса в PowerShell есть командлет Stop-Process . Он завершает указанный процесс по его имени или идентификатору. Однако мы поступим по другому и передадим результат выполнения командлета Get-Process по конвейеру:

Get-Process | where {$_.name -match ″notepad″} | Stop-Process


Get-Process не может показать процессы на удаленном компьютере, для этого воспользуемся командлетом Get-WmiObject , например посмотрим процессы на удаленном компьютере PC командой:

Get-WmiObject win32_process -computername PC | ft name, processid, description


Для боле полного ознакомления с PowerShell можно воспользоваться встроенной справкой, для вызова справки нужно набрать Get-Help ″имя командлета″

Ну и для полноты обзора рассмотрим еще одно средство для управления процессами из командной строки. Это утилиты Pslist и Pskill входящие в состав пакета PSTools от компании Sysinternals.

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


Завершение процесса программой pskill предельно просто, вводим команду и имя (или ID) процесса и все.


Справку по утилитам Pslist и Pskill можно посмотреть, введя команду с ключом /?

И еще, все манипуляции с процессами необходимо выполнять с правами администратора, для этого командную строку требуется запускать с повышением привилегий.

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

Но есть и исключения. Взять, к примеру, стандартный . Несмотря на то, что выводимая им информация о процессах вполне может быть распечатана, привычной команды “Распечатать” вы в нем не найдете. Но как быть, если вам вдруг понадобилось распечатать список текущих процессов? Не переписывать же их один за другим в текстовый файл!

В действительности вывести список процессов, служб и прочей системной информации в файл (на печать) очень просто. Самый простой способ – воспользоваться специальным программным обеспечением, например, хорошо известной каждому системному администратору утилитой Procexp или комплексным приложением AnVir Task Manager.

Но можно обойтись и без всякого стороннего программного обеспечения. Все что нам нужно, так это знание двух-трех команд выполняемых в командной строке или ее усовершенствованном аналоге PowerShell.

В консоли для вывода списка текущих процессов в файл используется команда tasklist с указанием пути. При выполнении команды файл создается автоматически. Существующий же файл будет перезаписан. Выглядит все следующим образом.

tasklist > D:processes.txt



При этом вы получите список текущих процессов с указанием имени сессии и процесса, его идентификатор, а также объем используемой каждым процессом выделенной памяти. Если у вас возникли проблемы с кодировкой (в текстовом файле крякозябры), измените кодировку, выполнив команду chcp со значением 1251.

chcp 1251
tasklist > D:processes.txt






Команда tasklist имеет множество параметров и фильтров позволяющих сортировать выводимые данные. Для получения подробной справки в командной строке следует использовать команду tasklist /?

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

get-process | out-file D:process.txt






В данном примере get-process получает список процессов, а out-file выводит его по указанному пути. Как вы можете видеть, выводимые данные с использованием PowerShell отличаются куда большей информативностью. Если вместо out-file использовать команду out-printer, можно вывести данные непосредственно на принтер.

С помощью PowerShell также можно выполнять множество других полезных операций. Этот универсальный инструмент, безусловно, будет полезен не только программистам и системным администраторам, для которых знание синтаксиса PowerShell является обязательным, но и опытным пользователям желающим сделать свою работу на компьютере более быстрой и продуктивной.