> For the complete documentation index, see [llms.txt](https://denis-3.gitbook.io/linuxguide-linux-dlya-nachinayushikh/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://denis-3.gitbook.io/linuxguide-linux-dlya-nachinayushikh/terminal-linux/processy-i-pamyat.md).

# Процессы и память

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

У каждого процесса есть свой идентификатор - PID (Process ID). Он присваивается процессу при запуске и представляет из себя целое число, больше нуля. Самый первый процесс, который запускается в системе - это init (systemd). Он является родительским, первым после загрузки дистрибутива и отвечает за запуск системы, управление сервисами, демонами и "усыновляет" "осиротевшие" процессы (дочерний процесс, чей родитель завершился нештатно, не подав сигнала о завершении). На самом деле, у процессов много интересных вещей и взаимодействий. Так что, из любопытства, можно взглянуть на подробную логику их работы и запуска в Linux, но не здесь)

Процессы делятся на переднего плана (интерактивные) и фоновые. Интерактивные работают на переднем плане, напрямую взаимодействуют с пользователем через интерфейс (например, Терминал). В Терминале они получают ввод с клавиатуры и выводят данные на экран. Фоновые процессы не подключены к Терминалу и напрямую не взаимодействуют с пользователем, поэтому не ждут от него никакого ввода. По сути, они работают "параллельно" другим. Есть ещё особый вид процессов под названием демоны. Но об этом позже.

У процессов есть разные состояния:

* R (Running) - процесс запущен и выполняется или готов к запуску
* S (Sleeping) - процесс ожидает какого-либо события, например ввода данных от пользователя или доступности какого-либо ресурса
* T (Stopped) - процесс остановлен, обычно сигналом
* Z (Zombie) - завершённый процесс, который ещё имеет запись в таблице процессов. Так происходит, когда родительский процесс проигнорировал или пока не прочитал статус завершения дочернего. В случае, если Z-процесс остался до завершения родителя, самый первый процесс (init) , запускаемый после загрузки системы, 'подбирает зомби' и завершает правильно
* X (Dead) - "мёртвый" процесс, обозначающий конечное состояние, когда системе остаётся лишь освободить дескриптор процесса (всю его информацию)

{% hint style="info" %}
Кратко про сигналы. Это механизм (асинхронного) уведомления процессов о событиях. Сигналы позволяют управлять процессами. Есть много видов сигналов. Например, `SIGINT`. Мы сталкиваемся с ним, когда хотим прервать выполнение команды в терминале (Ctrl+C). После этого процесс обычно завершается. `SIGTERM`, `SIGSTOP`,  `SIGKILL` используются для завершения процесса. Отличаются "настойчивостью" запроса, следовательно, интенсивностью действия. `SIGCONT` - продолжить выполнение приостановленного процесса. И `SIGHUP` - сообщение о закрытии управляющего Терминала. Позже разберём как подавать такие сигналы процессам через командную строку.
{% endhint %}

Чтобы посмотреть на все процессы, достаточно открыть каталог /proc, мы это знаем из структуры файловой системы Linux. Что нас встречает? Сотни пронумерованных папок и файлы данных о системе. Номер каталога - PID процесса. Если зайти в какой-либо из этих каталогов, то можно увидеть много других файлов, которые содержат различные данные и параметры процесса. Это и ссылка на исполняемый файл, и различные лимиты на ресурсы, и статус программы, и описание окружения, и сетевые параметры...

<figure><img src="/files/6R62oNyvQgYICBR3vOYN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Po5e5DKc3UEQ0gSMQOyo" alt=""><figcaption></figcaption></figure>

Итак, попробуем управлять этими процессами. Открываем терминал.

## ps

Эта команда выводит список процессов и позволяет узнать их статус. Если просто ввести `ps`, то можно увидеть запущенные процессы, связанные с текущей сессией Терминала.

<figure><img src="/files/Z6E3wPgSVYUnrM2ayKMG" alt=""><figcaption></figcaption></figure>

Чтобы увидеть все процессы, введите `ps -ef` или `ps aux`. Результат тот же, просто формат написания ключей разный.

<figure><img src="/files/T1CM8aQxfzQxjtDjFf0M" alt=""><figcaption></figcaption></figure>

Результат можно отсортировать. Например, по потреблению ресурсов. Для этого введите `ps aux --sort=%cpu`. Снизу будут б**о**льшие значения. Чтобы было наоборот, просто поставьте минус перед параметром сортировки `ps aux --sort=-%cpu`. А чтобы получить информацию по конкретному процессу, надо ввести `ps -p <PID> u`.

<div><figure><img src="/files/U11NJ7GNSgPvieWpJsPr" alt="" width="354"><figcaption></figcaption></figure> <figure><img src="/files/EmFJX4wjKLEPfYidUt3T" alt="" width="354"><figcaption></figcaption></figure></div>

## pstree

Эта команда нужна для показа дерева процессов. Чтобы вывести это дерево с PID процессов, введите `pstree -p`.

<figure><img src="/files/LuXRwcGoYHEi3AEB6Vlk" alt=""><figcaption></figcaption></figure>

## pgrep

Это утилита для поиска PID программы. Просто вводим `pgrep` и имя программы.

<figure><img src="/files/6ePUe1VKee7vwQk1uAVn" alt=""><figcaption></figcaption></figure>

## nice/renice

Это команды для изменения приоритета процесса в Linux. Чем больше приоритет, тем больше процессорного времени уделяется процессу. Уровень приоритета колеблется от 19 до -20, от минимального к максимальному. Чтобы установить приоритет к запускаемому процессу, используйте nice. Например, `nice -n 9 echo "Hello"`. Через ключ -n указывается значение приоритета. А чтобы изменить приоритет для существующего процесса по его PID, используйте renice, но с ключом -p, после которого нужно указать PID. Пример, `renice -n 9 -p 1951`. Примечание: увеличивать приоритет можно только с правами суперпользователя, для уменьшения приоритета процесса достаточно прав обычного.

<figure><img src="/files/H7ej72vyGlOAXMLK6lxB" alt=""><figcaption></figcaption></figure>

## kill

Чтобы завершить процесс, используйте kill. Синтаксис прост. Введите `kill`, а после PID процесса. Если надо завершить процесс по имени, используйте команду `killall`.

<figure><img src="/files/p619RmDILDd1uAiiuqEA" alt=""><figcaption></figcaption></figure>

По умолчанию, kill подаёт сигнал о корректном завершении процесса. Чтобы послать сигнал о немедленном завершении (абсолютное уничтожение), нужно ввести ключ с названием сигнала (KILL) без SIG или порядковым номером (9).

<figure><img src="/files/QJSVb51LiomObwYymlJk" alt=""><figcaption></figcaption></figure>

## top

Это консольная утилита для просмотра запущенных процессов и управления ими. Чтобы запустить её, введите в Терминале `top`. Чтобы выйти, нажмите q.

<figure><img src="/files/JKfgLEiv3fsYM8BCPjGt" alt=""><figcaption></figcaption></figure>

Чтобы показать процессы, характерные только для определённого пользователя, нажмите u и введите имя этого пользователя.

<figure><img src="/files/jqVuo6HL3vOyFOeYqZAG" alt=""><figcaption></figcaption></figure>

Есть ещё всякие похожие утилиты. Наиболее популярная - htop. Но её нет по умолчанию в системе, поэтому надо установить командой `sudo apt install htop`. Откроем, введя `htop`. Сразу видим более красочный и, в каком-то смысле, более удобный интерфейс. Хотя функция остаётся та же. Просматривать процессы и следить за памятью.

<figure><img src="/files/EcyEgyzzY1XpLBuFWW1U" alt=""><figcaption></figcaption></figure>

Кстати, о памяти. Давайте разберём несколько команд, связанных с памятью в Linux.

## df

Эта утилита помогает проверить свободное место в памяти и информацию о разделах. Запустим `df`.

<figure><img src="/files/SQNwiZgz32uhlf5rgPcF" alt=""><figcaption></figcaption></figure>

Слишком большие и непонятные цифры. Давайте отформатируем вывод в более читабельном формате. Для этого введём `df -h`.

<figure><img src="/files/YHZFeqFoBLtSHPQRuj9w" alt=""><figcaption></figcaption></figure>

Другое дело! Мы сейчас видим информацию обо всех примонтированных разделах. Довольно легко понять, сколько памяти выделилось на определённый раздел. То, что смонтировано в корень - и есть наша система. У меня уже использовано 45% дискового пространства. То, что относится к tmpfs - временные файловые системы, хранящиеся в ОЗУ. Чтобы отфильтровать их, можно использовать ключ `-x`. `df -x tmpfs`. И здесь мы видим корневой раздел, раздел загрузчика и раздел с подключённым диском.

<figure><img src="/files/AballafdP9BhsnPaXCiv" alt=""><figcaption></figcaption></figure>

Ключ -a покажет все файловые системы, известные системе. А если указать после df определённый раздел, то команда покажет информацию именно о нём.

<figure><img src="/files/Uj9LdotrX19euOVKYDIb" alt=""><figcaption></figcaption></figure>

## free

Полезная и простая утилита для проверки свободного места. Советую вводить с ключом -h, чтобы формат был более понятным. Тут есть информация об оперативной памяти и файле/разделе подкачки.

<figure><img src="/files/ZgCyQsDvTkmFjrlpsV1L" alt=""><figcaption></figcaption></figure>

## /proc/meminfo

Также подробную статистику использования памяти можно прочитать из файла /proc/meminfo. Для этого используем `cat`.

<figure><img src="/files/32nqbbIarzAXX5Fi57iq" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://denis-3.gitbook.io/linuxguide-linux-dlya-nachinayushikh/terminal-linux/processy-i-pamyat.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
