Что это за процесс
Имя, родитель, пользователь, полная команда, рабочий каталог, файл программы и служба — этого хватает, чтобы понять, откуда процесс взялся.
/proc — файловая система, в которой ядро показывает процессы (/proc/
ls /proc/1234/
всё о процессе 1234
grep -E 'State|PPid|VmRSS' /proc/1234/status
ls -l /proc/1234/fd
открытые файлы и сокеты
cat /proc/1234/limits
лимиты процесса
tr '\0' ' ' < /proc/1234/cmdline
командная строка
sudo cat /proc/1234/environ | tr '\0' '\n'
окружение
ls -l /proc/1234/cwd /proc/1234/exe
каталог и программа
cat /proc/1234/cgroup
служба или сеанс процесса
/proc — файловая система, которой нет на диске.
Ядро собирает содержимое её файлов в момент чтения. Каталог /proc/<PID>
есть у каждого процесса, остальные файлы описывают систему целиком, а
/proc/sys — параметры ядра. ps, top, free, uptime и pidstat
берут данные отсюда.
Размер у файлов — 0: данных нет, пока их не прочитали. Читать их надо
целиком — cat, grep, tr.
| Файл | Что внутри | Кто читает |
|---|---|---|
status |
имя, состояние, PPid, UID, память VmRSS, потоки Threads |
все |
cmdline |
командная строка, аргументы через нулевой байт | все |
limits |
лимиты ресурсов: мягкий и жёсткий | все |
cgroup |
группа процесса: служба или сеанс | все |
oom_score, oom_score_adj |
оценка и поправка OOM | все |
task/ |
потоки процесса | все |
environ |
окружение на момент запуска | владелец и root |
fd/ |
открытые дескрипторы: файлы, сокеты, каналы | владелец и root |
cwd, exe |
текущий каталог и файл программы | владелец и root |
io |
байты чтения и записи | владелец и root |
maps |
области памяти и файлы в них | владелец и root |
stack |
стек ядра процесса | root |
Чужой процесс без sudo отвечает Permission denied, а wchan — нулём.
/proc/self — каталог того процесса, который его читает: cat
/proc/self/status покажет cat.
| Поле | Что значит |
|---|---|
State |
состояние: R, S, D, Z, T (см. load-average) |
PPid |
PID родителя |
Uid |
четыре UID: реальный, действующий, сохранённый, для ФС |
VmRSS |
память процесса в RAM (см. memory-swap) |
Threads |
число потоков |
voluntary_ctxt_switches |
сколько раз процесс сам отдал процессор |
Каждая ссылка — открытый дескриптор: номер и то, на что он указывает. Сокет
выглядит как socket:[2076], канал — pipe:[…]. Число дескрипторов —
ls /proc/<PID>/fd | wc -l; сравни его с Max open files в limits (см.
ulimit).
Файл удалили, а процесс держит его открытым — ссылка кончается на
(deleted), место на диске не освобождается (см.
удалённый открытый файл):
У службы systemd стандартный ввод — /dev/null, а вывод уходит в сокет
журнала: у systemd-resolved 0 -> /dev/null, 1 -> socket:[3608].
exe — ссылка на файл программы, maps — области памяти процесса и
файлы, отображённые в них: сама программа и каждая
общая библиотека. libc.so.6 на учебной машине
отображена в 38 процессов сразу.
Обновление заменяет файл на диске новым, а процесс продолжает выполнять
старый. Ссылка exe и строки maps тогда кончаются на (deleted):
Столбцы maps: адреса области, права (r-xp — код), смещение в файле,
устройство, inode и путь. Исправление в новой версии на такой процесс не
действует, пока его не перезапустят. Найти все такие процессы:
Смотри путь: строки /memfd:… (deleted) — память без файла на диске, к
обновлению они не относятся. То же для служб с готовой командой перезапуска печатает needrestart
(см. unattended-upgrades), в lsof такие файлы отмечены
DEL (см. lsof).
Каждая строка — блокировка файла: тип (FLOCK от flock, POSIX от
fcntl), WRITE или READ, PID владельца, устройство и inode файла
(fd:04:2703 — inode 2703, как в столбце NODE у lsof). Строка с
-> — процесс 1112 ждёт эту блокировку. Держит её процесс 1094.
Аргументы в cmdline и переменные в environ разделены нулевым байтом,
tr превращает их в пробелы или строки:
environ — окружение на момент запуска: export в работающей оболочке в
него не попадёт, его увидят только процессы, запущенные после. У потоков
ядра (kthreadd и других) cmdline пустой.
/proc/<PID>/limits — лимиты, с которыми процесс работает сейчас. Их
меняют ulimit, LimitNOFILE= службы и prlimit; поправка в юните без
перезапуска службы сюда не попадает (см. ulimit).
cgroup отвечает, чей процесс: службы ssh.service или сеанса
пользователя. То же короче — ps -o pid,unit,comm -p <PID>.
| Файл | Что внутри |
|---|---|
/proc/loadavg |
load average и число задач (см. load-average) |
/proc/meminfo |
память: MemTotal, MemAvailable, Cached (см. memory-swap) |
/proc/pressure/ |
доля времени ожидания CPU, памяти, диска |
/proc/cpuinfo |
процессоры и их модель |
/proc/uptime |
секунды с загрузки и суммарный простой процессоров |
/proc/cmdline |
параметры, с которыми загружено ядро |
/proc/mounts |
смонтированные файловые системы |
/proc/swaps |
активный swap |
/proc/sys/ |
параметры ядра (см. sysctl) |
Каждый параметр ядра — файл: vm.swappiness — это
/proc/sys/vm/swappiness, точки в имени заменяют косую черту.
sysctl читает и пишет эти же файлы. Запись — через tee:
Имя, родитель, пользователь, полная команда, рабочий каталог, файл программы и служба — этого хватает, чтобы понять, откуда процесс взялся.
find печатает ссылки вида /proc/956/fd/3: PID и номер дескриптора.
Пока процесс жив, файл можно скопировать по этой ссылке. Место
освободится, когда процесс закроет файл или завершится.
fd, environ, cwd, exe, io, maps чужого процесса читает только
root. Повтори с sudo.
Перенаправления < и > выполняет твоя оболочка без прав root, sudo
действует только на команду. Читай sudo cat … | tr …, пиши
echo … | sudo tee ….
Процесс уже завершился, и его каталог исчез вместе с ним. PID мог занять
новый процесс — сверь cmdline.
Переменную задали после запуска процесса. environ её не покажет —
перезапусти процесс с нужным окружением.
/proc./proc/<PID>/limits./proc/sys./proc/loadavg и состояние D./proc/meminfo и RSS.Есть неточность? Сообщить об ошибке в статье