Урок 19. Знакомство с процессами

 

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

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

Для выполнения каждого процесса приходится выделять память и процессорное время. 

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

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

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

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

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

    • 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 имеет множество опций, причем некоторые используются с дефисом, а некоторые - без. Поэтому предлагаю просто запомнить наиболее используемые команды. 

Список всех процессов: ps aux

Вывод команды ps aux

 

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

Вывод команды ps -ef

 

Отображение дерева процессов, то есть схематическое отображение от какого процесса был порожден конкретный процесс: ps auxf

Отображение дерева процессов командой ps auxf

Из рисунка видно, что процесс /usr/sbin/mdm породил 2 процессы /usr/lib и cinnamon. 

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

Вывод команды ps ajxf

Взгляните внимательно на выделенный текст. Например, процесс 1358 - /usr/bin/py породил новый процесс cinnamon c PID=1375. Видно, что его родительский PPID = 1358 (в первой колонке).

Более короткий вывод дерева процессов: pstree

Укороченный вывод дерева процессов командой 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

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

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

Завершение процесса - клавиша “к”, затем введите номер процесса:

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

 

Отображение процессов конкретного пользователя - клавиша “U”, затем введите UID или имя пользователя:

Отображение процессов конкретного пользователя в программе top

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

Вывод команды top U

 

Помощь - клавиша “h” или “?

Вызов помощи и подсказки в программе top

Выход из программы - клавиша “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

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

Так как мы находимся в каталоге /home/student/Documents, то команда отображает все каталоги данного каталога. В конце списка указывается общий объем занятой памяти. 

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

Конечно. Используйте опцию -sdu -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 - укороченное отображение информации о занимаемом объеме памяти текущим каталогом