Что такое процессы?
Процессы — это по сути работающие программы, которые могут быть запущены как самой системой, так и любым пользователем. Данные программы могут работать как в фоновом режиме и быть невидимыми, так и на переднем плане и иметь своеобразный видимый интерфейс. Для выполнения каждого процесса приходится выделять память и процессорное время.
Для чего необходимо изучать процессы?
Бывает так, что компьютер “тормозит” и не позволяет выполнять некоторые важные операции. Такое происходит, когда какой-нибудь процесс занимает большую часть оперативной памяти или процессорного времени. Зная основы работы с процессами можно отключить мешающий процесс и разгрузить компьютер. Существуют ситуации, когда запущенная программа перестает реагировать на действия пользователя и никак не удается ее закрыть штатным способом. В данном случае достаточно найти процесс данной программы и принудительно закрыть программу.
К процессам часто обращаются, когда компьютер содержит вирус или другое вредоносное ПО. Взглянув на процессы можно найти аномальное поведение системы и найти вредоносное ПО. Поэтому даже обычному пользователю необходимо знать основы работы с процессами. Прежде, чем мы рассмотрим как управлять процессами, перечислим основные параметры, характерные для каждого процесса:
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 — укороченное отображение информации о занимаемом объеме памяти текущим каталогом