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

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

Для чего необходимо изучать процессы?

Бывает так, что компьютер “тормозит” и не позволяет выполнять некоторые важные операции. Такое происходит, когда какой-нибудь процесс занимает большую часть оперативной памяти или процессорного времени. Зная основы работы с процессами можно отключить мешающий процесс и разгрузить компьютер. Существуют ситуации, когда запущенная программа перестает реагировать на действия пользователя и никак не удается ее закрыть штатным способом. В данном случае достаточно найти процесс данной программы и принудительно закрыть программу.

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

PID — (process ID) идентификатор каждого процесса

PPID — (parent process ID) идентификатор родительского процесса. Процесс может порождать и другие процессы.

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

EUID, EGID — эффективные идентификаторы пользователя и его группы. В 16-ом уроке мы изучали признаки доступа SUID, SGID. Когда пользователь запускает файл с установленными признаками, то эффективные идентификаторы  (EUID, EGID) равны реальным идентификаторам (UID, GID) владельца данного файла. То есть система смотрит на эффективные идентификаторы и таким образом узнает, что был установлен признак SUID/SGID и предоставляет доступ пользователю. Если пользователь запустит любой другой файл без установленного признака SUID/SGID, то реальные и эффективные идентификаторы всегда равны.

Priority/Nice — приоритет и относительный приоритет. Служит для выделения большего или меньшего процессорного времени для определенного процесса. Разрешается менять только относительный приоритет (Nice). Его значение варьируется от -20 до +19. Чем ниже значение относительного приоритета, тем больше процессорного времени выделяется для данного процесса.

STAT — состояние процесса. В таблице представлены обозначения процессов:

Состояние Описание
R (runnable) Работающий процесс
S (sleeping) Процесс в состоянии ожидания
T (stopping) Остановленный процесс
Z (zombie) Завершившийся процесс
В (uninterruptible) Непрерывный процесс

Кроме того, помимо состояния самого процесса можно увидеть и дополнительную информацию (индикатор), которая следует сразу за символом состояния:

Индикатор Описание
< Процесс с высоким приоритетом
N Процесс с низким приоритетом
L Процесс имеет страницы, заблокированные в памяти
s Процесс является лидером сессии
l
+ Процесс работает на переднем плане

Как же можно увидеть все процессы?

Для этого существует команда ps. Однако в “чистом виде” она обычно не используется, поэтому применяются различные опции. Она имеет множество опций, причем некоторые используются с дефисом, а некоторые — без. Поэтому предлагаю просто запомнить наиболее используемые команды.

  • Список всех процессов — ps aux
  • Отображение всех процессов, включая и PPID — ps -ef
  • Отображение дерева процессов, то есть схематическое отображение от какого процесса был порожден конкретный процесс — ps auxf
  • Отображение дерева процессов, включая PPID — ps ajxf
  • Более короткий вывод дерева процессов — pstree
  • Отображение процессов конкретного пользователя — ps U пользователь

Вывод каждой команды частично отличается, частично совпадает. Кроме того, отображаются ненужные данные.

Есть ли возможность использования универсальной и более удобной, команды чтобы не использовать тяжело запоминаемые опции?

Конечно, такая команда существует и вот как она выглядит — ps -eo параметр_1, параметр_2, и так далее. Например, нам необходимо отобразить только пользователя и его процесс — ps -eo user,cmd

Теперь отобразим пользователя, его UID, GID, идентификатор процесса, родительский идентификатор и название процесса — ps -eo user,uid,gid,pid,ppid,cmd

Выводом команды можно управлять и исключить ненужную информацию. Список параметров доступен на 1-ой странице встроенного мануала.

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

Теперь, когда мы знаем номер процесса и программу, то мы можем ее принудительно закрыть.

Как это сделать?

С помощью команд kill и killall. Упрощенный формат команд выглядит так:

kill PID_процесса

killall имя_процесса

Есть небольшой нюанс в работе команд kill/killall. Процесс можно закончить разными способами. Для этого существуют различные сигналы.Чтобы узнать список всех доступных сигналов введи команду kill -l

Нам достаточно запомнить всего лишь 2 сигнала: TERM и KILL.

TERM — “мягкое” завершение процесса и порожденных им процессов, все открытые файлы закрываются и ресурсы системы освобождаются.

KILL — “грубое” завершение процесса. Все порожденные процессы останутся незавершенными и может привести к непредсказуемым последствиям. Поэтому данный способ лучше применять лишь в крайних случаях.

Как указать такой сигнал?

По умолчанию всегда используется TERM, если нужно указать другой сигнал то используется следующий формат:

kill -9 PID_процесса

либо

kill KILL PID_процесса

Цифра означает номер сигнала при выводе списка командой kill -l.

 

Динамическое отображение процессов.

Команда ps полезна при поиске определенного процесса и общего представления загрузки системы. Однако у нее есть небольшой недостаток — выходные данные команды не обновляются. В то время, пока мы смотрим на процесс, он может уже закончится. То есть команда ps попросту делает мгновенный “снимок” процессов на момент исполнения команды.

Как получить автоматически обновляющийся список процессов?

С помощью команды top

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

Что это за команды?

  • Завершение процесса — клавиша “к”, затем введите номер процесса
  • Отображение процессов конкретного пользователя — клавиша “U”, затем введите UID или имя пользователя
  • Помощь — клавиша “h” или “?
  • Выход из программы — клавиша “q” или Ctrl + C. Программа поддерживает много команд, поэтому предлагаю ознакомиться с ними самостоятельно при желании.

 

Просмотр открытых/задействованных файлов

Мы уже знаем, что процессы могут порождать дочерние процессы, а также открывать файлы. Но как узнать какие файлы какими процессами были открыты?

Для этого существует команда lsof. Она предоставляет следующую информацию:

  • открытые файлы
  • запущенные команды, открывшие данный файл
  • пользователь, запустивший данную команду
  • номер процесса

Список всех открытых файлов — lsof

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

Список открытых файлов конкретной команды — lsof -c команда

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

Список открытых файлов конкретного процесса — lsof -p PID

Запустив простую команду xclock (аналоговые часы) мы видим сколько файлов она открыла. Данная команда похожа на предыдущую. Только в данном случае исследуется отдельный процесс, в том время как lsof- c может исследовать и дочерние процессы.

Список открытых файлов конкретного пользователя — lsof -u пользователь

Когда в системе зарегистрировано несколько пользователей, то полезно знать какие программы они запустили. Например, некоторые пользователи любят открывать много вкладок в интернет браузере (Chrome, Firefox). Естественно это нагружает систему. Недостаточно просто убить процесс “chrome” или “firefox”, так его используют все пользователи, просто одни меньше, а другие — больше. Данная команда поможет сузить зону поиска.

 

Сведения об используемой памяти.

Оперативная память — free -h

Объем памяти жесткого диска — df -h

Команда отображает файловую систему, точку монтирования и память для каждой файловой системы. TMPSF временная файловая система, которая используется в оперативной памяти компьютера.

Объем занятой памяти конкретного каталога — du -h

Можно ли отобразить только общий объем занятой памяти данного каталога?

Конечно. Используйте опцию -s — du -sh

Имейте в виду, что данная команды показывает объем памяти текущего каталога.

 

Список используемых команд:

ps aux — список всех процессов на момент исполнения команды

ps -ef  —  отображение процессов, включая и PPID

ps auxf  — отображение дерева процессов

ps ajxf  — отображение дерева процессов, включая PPID

pstree — упрощенное отображение дерева процессов

ps U пользователь  — отображение процессов пользователя

ps -eo параметр_1, параметр_2, и так далее — отображение требуемого списка процессов

kill PID_процесса — завершение процесса по его идентификатору

killall имя_процесса — завершение процесса по его имени

kill -l — отображение списка доступных сигналов для завершения процессов

top — отображение динамического списка процессов

lsof — отображение списка открытых файлов

lsof -c команда — отображение списка открытых файлов указанной командой/программой

lsof -p PID — отображение списка открытых файлов указанного процесса

lsof -u пользователь — отображение списка открытых файлов указанного пользователя

free -h — отображение информации об использовании оперативной памяти

df -h — отображение информации об объеме памяти жесткого диска

du -h — подробное отображение информации о занимаемом объеме памяти текущим каталогом

du -sh — укороченное отображение информации о занимаемом объеме памяти текущим каталогом