Процессы Linux. Управление процессами. Часть 1: Мониторинг

Привет, друг! Я думаю тебя не сильно удивит, если я провокационно заявлю что операционная система Linux довольна проста в использовании. Я имею ввиду в повседневном. Конечно же профессиональные оконщики со мной не согласятся и смогут привести массу аргументов. Большая часть из которых будет начинаться со слова терминал. Не знаю к чему я это написал… Я вообще хотел написать про другое. А именно про то, что если ты собираешься что-то понимать в хацкерстве или в чём-то подобном, то с Linux дело придется иметь. А чтобы дело имелось комфортно, не плохо было бы разобраться и научится этим всем пользоваться. Ну ещё лучше конечно начать понимать как всё это работает, но это уже «next level», так сказать. Мы с тобой конечно к этому придём. Но потом. А сейчас будем изучать процессы Linux.

Основы Linux. Управление процессами. Часть 1

Мы как то уже разбирались с основами. Были статьи где мы научились работать с сетью (ТУТ) и разобрали структуру файловой системы Linux, одновременно разобравшись как работать с файлами и каталогами (ТУТ). Но, как ты понимаешь, это капля в море. Потому продолжим изучать основы Linux. И сегодня поговорим о такой немаловажной штуке как процессы Linux и о том как ими управлять.

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

Что такое процессы в Linux

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

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

Переменная PATH это, по сути, список директорий, в которых операционная система пытается искать исполняемые файлы
Переменная PATH

Ну и соответственно если нужной программы в этих каталогах нет, то, для запуска, путь нужно вписывать полностью. Либо если запускаешь из каталога в котором сейчас находишься, то путь можно заменить точкой т.е.: ./имя_файла

Компоненты процесса

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

Идентификаторы процессов

Как ты наверняка понимаешь всяческих процессов в Linux довольно много. А с твоей помощью их будет становится только больше. И, логично предположить, что в них как-то нужно ориентироваться. Причём если для тебя это опциональный навык, то для самой системы жизненно необходимый. А соответственно в Linux существует немалое количество всяких идентификаторов процессов. И раз уж мы тут изучаем основы Linux, то знать где какой идентификатор и что он означает будет очень не лишним.

PID (Process ID) — уникальный идентификатор процесса, который назначается каждому процессу ядром. В большинстве случаев когда ты будешь работать с процессами, тебе нужно будет использовать именно его, для точного указания нужного процесса.

PPID (Parent Process ID) — тут фишка в том что в Linux для выполнения программы не создаётся новый процесс, а какой-то из существующих клонирует себя, а потом заменяет текущую выполняемую программу на новую. В этой истории исходный процесс принято называть родительским, а его клон дочерним. Естественно дочернему процессу присваивается собственный PID, но помимо этого он ещё и имеет атрибут PPID, который совпадает с идентификатором родительского процесса. Может такое случится что родительский процесс будет завершен раньше дочернего. Это не означает что все дочерние процессы тут же отвалятся, нет, в этой ситуации демон systemd подставит себя на место родительского процесса. Демон systemd это первая программа запускаемая после загрузки ядра, соответственно всегда имеет идентификатор 1. (более подробно про это всё расскажу когда будем рассматривать жизненный цикл процесса)

Тут нужно заметить, дабы не провоцировать агрессию красноглазых, что я упоминаю именно systemd в качестве подсистемы инициализации, только потому, что примеры буду показывать в Ubuntu. В других дистрибутивах может быть демон init, или какой-то другой в зависимости от эксклюзивности дистрибутива

UID (User ID) — это идентификатор пользователя создавшего процесс. Тут нужно знать только то что менять атрибуты процесса могут только его создатель и суперпользователь.

GID (Group ID) — это идентификатор группы к которой принадлежит владелец процесса.

Контроль и мониторинг процессов

Пожалуй хватит теории, пора уже что-то в терминал писать. Но для того чтобы что-то делать с процессами, их, для начала нужно увидеть. Чтобы увидеть список процессов существует команда ps. На самом деле есть более удобные и практичные (про них чуть позже), но про ps знать точно нужно, потому что она, так сказать, стоит у истоков.

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

ps
процессы linux

То мы увидим только наши собственные процессы Linux. Почти всегда этого мало. Тут нюанс в том что ps это максимально замороченная хрень, имеющая великую тьму параметров, которые мало того, что ещё и между собой нужно комбинировать, так ещё и регистр важен. Разбирать мы всё это, конечно же не будем. Потому что, чтобы решать повседневные задачи достаточно знать всего несколько параметров.

И наиболее актуальный вариант использования, это:

ps aux
процессы linux

Для понимания. Опция a означает что мы хотим увидеть все процессы. Опция х означает что мы хотим увидеть вообще все процессы Linux, в том числе те которые не относятся к текущему управляющему терминалу. А используя параметр u мы обеспечиваем дополнительную фильтрацию по пользовательским параметрам.

На выходе мы видим таблицу со списком процессов. Где тут что, вроде как, понятно, но на всякий случай объясню подробней.

USERИмя владельца процесса
PIDИдентификатор процесса
%CPUДоля времени процессора (в процентах), выделенная процессу
%МЕМЧасть оперативной памяти (в процентах), используемая процессом
VSZВиртуальный размер процесса
RSSКоличество блоков памяти
ТТYИдентификатор управляющего терминала
STATТекущий статус процесса:
R : процесс выполняется в данный момент;
S : процесс ожидает (т.е. спит менее 20 секунд);
I : процесс бездействует (т.е. спит больше 20 секунд);
Z : zombie, то есть завершившийся процесс, код возврата которого пока не считан родителем;
T : процесс остановлен;
D : ожидает записи на диск;
< : процесс в приоритетном режиме;
N : процесс в режиме низкого приоритета;
L : real-time процесс, имеются страницы, заблокированные в памяти;
s : лидер сессии.
STARTвремя, когда процесс был запущен
TIMEКоличество времени процессора, затраченное на выполнение процесса
COMMANDКоманда, которой был запущен процесс. Если команда в квадратных скобках это поток ядра запланированный в качестве процесса

Иерархия процессов

Я уже упоминал, что процессы Linux создаются путём клонирования. И вот эта штука с родительскими и дочерними процессами создаёт определённую иерархию процессов, так как один процесс всегда порождает другой и так далее. И именно так формируется дерево процессов. А оно, в свою очередь, даёт нам возможность визуализировать всю эту историю и наглядно понять кто тут главный.

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

pstree
pstree

Найдя в дереве (да и любым другим способом тоже) нужный нам процесс, в большинстве случаев необходимо получить по нему более развёрнутую информацию. В особенности нам нужен будет его PID, чтобы работать именно с тем процессом с которым нужно и не наворотить делов.

Получить данные по конкретному процессу можно используя ту же утилиту ps, отфильтровав результаты с помощью команды grep. Например:

ps aux | grep -v grep | grep NetworkManager

Обрати внимание что я удалил из выдачи (-v) саму команду grep. Она будет в результатах потому что grep активна во время выполнения ps. Но так как мы её сами и запускаем, то смотреть на неё нам не интересно. Этого можно не делать, но так, типа прикольнее, мы получает только тот результат который нужен и ничего лишнего.

Если нам нужно увидеть только PID процесса, то для этого есть утилита pgrep.

pgrep NetworkManager
процессы linux

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

fuser -v /home/dspulse
процессы linux

Таким способом мы увидим все процессы Linux использующие домашний каталог пользователя dspulse. Если ввести команду без параметра -v, то мы увидим только PID процессов получивших доступ.

Процессы Linux. Утилита TOP

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

Самый базовый, но не самый удобный вариант, это использование команды top. Начнём мы именно с неё чтобы было понимание как это работает.

top
утилита top

После запуска мы увидим общую сводку по использованию ресурсов системы и список активных процессов. Причём наиболее активные будут вверху. По умолчанию этот список будет обновляться каждые три секунды. Чтобы изменить этот параметр нажми клавишу D.

Колонки по умолчанию немного отличаются от тех что мы видели в ps:

  • PID — идентификатор процесса;
  • USER — имя пользователя, от имени которого выполняется процесс;
  • PR — приоритет планировщика, установленный для процесса;
  • NI — рекомендуемый приоритет процесса;
  • VIRT — память которая используется или зарезервирована для использования;
  • RES — всё, что находится в оперативной памяти и относится к процессу;
  • SHR — часть памяти из RES, которую занимают ресурсы, доступные для использования другим процессам;
  • S — состояние процесса, используются те же значения что и в ps;
  • %CPU — процент использования ресурсов процессора;
  • %MEM — процент использования ресурсов оперативной памяти на основе колонки RES;
  • TIME — обще процессорное время, которое процесс использовал с момента запуска;
  • COMAND — команда, с помощью которой был запущен процесс.

При этом, удобно то, что набор колонок можно поменять под свои нужны. Для этого нажимаем клавишу F и пробелом выбираем нужные колонки.

Если какой-то процесс нам не нравится или мешает, мы можем его остановить. Для этого жмём клавишу K и вводим PID нужного процесса. Затем нас спросят какой сигнал отправить процессу. Так как в этом рассказе до сигналов я ещё не дошёл, пока просто запомни, что в большинстве случаев нужно отправлять сигнал 15. Но если процесс отказывается завершаться то сигнал 9.

Процессы Linux. Утилита HTOP

Более удобный и практичный вариант монитора процессов это утилита htop. Она более наглядней и симпатичней оформлена. Ну и настроить её под свои задачи можно намного точнее. Но для начала её нужно установить:

sudo apt install htop
htop
утилита htop

Колонки здесь, по умолчанию те же что и в топ. Снизу мы видим список горячих клавиш. Чтобы настроить под свои хотелки, жмём F2 и выбираем нужные параметры. С остальными горячими клавишами я думаю тоже понятно из их названий.

Gnome System Monitor

Ну и список утилит мониторинга процессов был бы не полным без упоминания Gnome System Monitor. Это тоже самое но с графическим интерфейсом. (если у тебя KDE то там KDE System Guard).

Запустить его можно либо выбрав в меню, либо написав в терминале:

gnome-system-monitor
Gnome System Monitor

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

На этом, в принципе, первую часть рассказа про процессы можно заканчивать. Теперь ты знаешь что такое процессы в Linux и как их находить. Осталось только научится их контролировать. И именно этим мы займёмся в следующей статье на эту тему. А точнее разберем жизненный цикл процесса, узнаем про сигналы, приоритеты, разберемся с системными процессами и потоками ядра, а также научимся этим всем управлять. А потому не забывай возвращаться к нам.

Твой Pulse.