# Процесс и PID _Процессы и ресурсы · LinuxLab Knowledge Base_ **TL;DR:** Процесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1). ## Что такое процесс Процесс - это **выполняющийся** экземпляр программы. У него есть: - **PID** (Process ID) - уникальный числовой идентификатор - **PPID** (Parent PID) - кто его породил - **UID/GID** - от чьего имени работает (см. [file-permissions](/kb/file-permissions.md)) - **Виртуальное адресное пространство** - heap, stack, mmap'ы, общие библиотеки - **Открытые файловые дескрипторы** (`/proc//fd/*`) - **Текущий рабочий каталог** (cwd) - **Контроллер группы** ([cgroups](/kb/cgroups.md)) и набор [namespaces](/kb/namespaces.md) - что он видит ## fork + exec Новый процесс в Linux всегда создаётся одной из этих пар системных вызовов: - `fork()` - клонировать текущий процесс. Получаем дочерний с тем же кодом и состоянием, но новым PID - `exec*()` - заменить **в текущем процессе** код+данные на содержимое бинаря; PID сохраняется Так шелл запускает команду: `fork()` → дочерний процесс делает `exec("/bin/ls")`. Родитель ждёт через `wait()`. ## Дерево процессов Все процессы - потомки одного: PID 1 (`init`, на современных системах это systemd). Если родитель умрёт раньше потомка, потомок «усыновляется» PID 1. ``` systemd ├─ sshd │ └─ sshd: alice@pts/0 │ └─ bash │ └─ vim ├─ docker └─ ... ``` ## /proc/ - анатомия процесса В Linux каждый живой процесс - это директория `/proc//`: - `cmdline` - что было в argv - `exe` → symlink на бинарь - `cwd` → symlink на CWD - `fd/` - все открытые файловые дескрипторы (как [symbolic-link](/kb/symbolic-link.md) на цели) - `status` - карточка с метаданными (UID, threads, memory) - `cgroup` - в каком cgroup'е находится процесс - `ns/` - какие [namespaces](/kb/namespaces.md) видит ## Состояния процесса - **R (Running/Runnable)** - на CPU или в очереди ожидания CPU - **S (Sleeping)** - ждёт события (interruptible: можно прервать сигналом) - **D (Uninterruptible Sleep)** - ждёт I/O в kernel-mode, нельзя прервать. Высокая доля D обычно значит проблемы с диском/NFS, и она тянет [load-average](/kb/load-average.md) вверх - **Z (Zombie)** - завершился, но родитель ещё не сделал `wait()` - занимает PID но не RAM - **T (Stopped)** - приостановлен сигналом SIGSTOP или Ctrl+Z ## Команды ```bash ps -ef | head ``` Все процессы в системе с PID, PPID, UID, командой ```bash ps -p $$ -o pid,ppid,comm,state ``` Информация о текущем шелле ($$ = PID шелла) ```bash pstree -p ``` Дерево процессов с PID-ами ```bash cat /proc/$$/status | head -10 ``` Карточка текущего шелла из /proc ```bash ls -l /proc/self/fd/ ``` Открытые file descriptors процесса (`self` всегда указывает на читающий) ## См. также - [Сигналы (SIGTERM, SIGKILL, SIGHUP)](/kb/signals.md) - [ps - снимок процессов](/kb/cmd-ps.md) - [htop - интерактивный монитор процессов](/kb/cmd-htop.md) - [cgroups (v2)](/kb/cgroups.md) - [Linux namespaces](/kb/namespaces.md) - [strace - какие syscall'ы делает процесс](/kb/cmd-strace.md)