Глубокое погружение в каталог Linux /proc/pid

Что такое прок

Каталог /proc в системе Linux также является файловой системой, но он отличается от других распространенных файловых систем, таких как /etc, /varproc — это псевдофайловая система (то есть виртуальная файловая система), в которой хранится ряд специальных файлы текущего состояния работы ядра, с помощью которых пользователи могут просматривать соответствующее системное оборудование и текущую информацию о запущенных процессах и даже изменять рабочее состояние ядра, изменяя некоторые из этих файлов.

Исходя из упомянутой выше особенности файловой системы /proc, файлы в ней часто называют виртуальными файлами и имеют некоторые уникальные характеристики.

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

$ ls /proc
...
dr-xr-xr-x  4 root            root               0 Nov 13 22:13 bus
-r--r--r--  1 root            root               0 Nov 17 09:20 cgroups
-r--r--r--  1 root            root               0 Nov 17 09:20 cmdline
-r--r--r--  1 root            root               0 Nov 17 09:20 consoles
-r--r--r--  1 root            root               0 Nov 17 09:20 cpuinfo
-r--r--r--  1 root            root               0 Nov 17 09:20 crypto
-r--r--r--  1 root            root               0 Nov 17 09:20 devices
-r--r--r--  1 root            root               0 Nov 17 09:20 diskstats
-r--r--r--  1 root            root               0 Nov 17 09:20 dma
dr-xr-xr-x  2 root            root               0 Nov 17 09:20 driver
-r--r--r--  1 root            root               0 Nov 17 09:20 execdomains
-r--r--r--  1 root            root               0 Nov 17 09:20 fb
-r--r--r--  1 root            root               0 Nov 17 09:20 filesystems
dr-xr-xr-x  8 root            root               0 Nov 13 22:13 fs
-r--r--r--  1 root            root               0 Nov 17 09:20 interrupts
-r--r--r--  1 root            root               0 Nov 17 09:20 iomem
-r--r--r--  1 root            root               0 Nov 17 09:20 ioports
dr-xr-xr-x 25 root            root               0 Nov 13 22:13 irq
-r--r--r--  1 root            root               0 Nov 17 09:20 kallsyms
...

Для удобства просмотра и использования эти файлы обычно классифицируются и хранятся в разных каталогах или даже подкаталогах в зависимости от их актуальности. Например, в каталоге /proc/scsi хранится соответствующая информация обо всех устройствах SCSI в текущей системе, /proc/N — это важная информация о текущем запущенном процессе системы, где N — идентификатор запущенного процесса.

Большинство виртуальных файлов можно просматривать с помощью команд просмотра файлов, таких как cat, more или less. Некоторая информация о файле может быть четко выражена с первого взгляда, но некоторая информация о файле не очень удобочитаема. Однако эти менее читаемые файлы могут иметь хорошую производительность при просмотре с помощью некоторых команд, таких как free, lspci или top.

Каталог PID в процедуре

Каталог /proc содержит множество подкаталогов, названных в честь номеров. Эти числа указывают номер процесса, выполняющегося в данный момент в системе, который содержит несколько информационных файлов, связанных с соответствующим процессом.

Давайте подробно рассмотрим один из каталогов процессов:

/proc/‹pid›/arch_status

Новый интерфейс для предоставления информации об архитектуре для данного процесса Linux. Когда CONFIG_PROC_PID_ARCH_STATUS включен, появится этот новый файл arch_status для предоставления любой дополнительной информации об архитектуре для данной задачи.

/proc/‹pid›/attr

Атрибуты безопасности процесса.

  • exec: представляет атрибуты, назначенные процессу, это необходимо для поддержки смены ролей/доменов.
  • fscreate: представляет атрибуты для назначения файлов, созданных последующими вызовами — mkdir — символическая ссылка
  • keycreate: если/когда процесс записывает контекст безопасности в этот файл, все предыдущие ключи будут помечены этим контекстом.
  • prev: показывает предыдущие значения /proc/[PID]/attr/current
  • sockcreate: если/когда процесс записывает контекст безопасности в этот файл, все ранее созданные сокеты будут помечены этим контекстом

/proc/‹pid›/автогруппа

Членство процесса в автогруппе (группе задач). Например:

$ cat autogroup
/autogroup-7430 nice 0

Этот файл также можно использовать для изменения пропускной способности ЦП, выделенной
автогруппе. Это делается путем записи в файл числа из диапазона "хороший"
, чтобы задать хорошее значение автогруппы.

/proc/‹pid›/auxv

Это означает ВСПОМОГАТЕЛЬНЫЙ вектор. Он содержит содержимое информации интерпретатора ELF, переданной процессу во время выполнения.
Значения — это те, которые были переданы операционной системой в качестве информации о запуске динамическому компоновщику. Эти векторы представляют собой механизм для передачи некоторой информации, специфичной для ОС, программному интерпретатору (например, ld) и процессу.

$ hexdump -Cv auxv
00000000  21 00 00 00 00 00 00 00  00 90 dd 50 fd 7f 00 00  |!..........P....|
00000010  10 00 00 00 00 00 00 00  ff fb 8b 17 00 00 00 00  |................|
00000020  06 00 00 00 00 00 00 00  00 10 00 00 00 00 00 00  |................|
00000030  11 00 00 00 00 00 00 00  64 00 00 00 00 00 00 00  |........d.......|
00000040  03 00 00 00 00 00 00 00  40 00 a0 3e 73 55 00 00  |........@..>sU..|
00000050  04 00 00 00 00 00 00 00  38 00 00 00 00 00 00 00  |........8.......|
00000060  05 00 00 00 00 00 00 00  09 00 00 00 00 00 00 00  |................|
00000070  07 00 00 00 00 00 00 00  00 b0 1e bf 60 7f 00 00  |............`...|
00000080  08 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000090  09 00 00 00 00 00 00 00  50 6d a0 3e 73 55 00 00  |........Pm.>sU..|
000000a0  0b 00 00 00 00 00 00 00  e9 03 00 00 00 00 00 00  |................|
000000b0  0c 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000000c0  0d 00 00 00 00 00 00 00  e9 03 00 00 00 00 00 00  |................|
000000d0  0e 00 00 00 00 00 00 00  e9 03 00 00 00 00 00 00  |................|
000000e0  17 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
000000f0  19 00 00 00 00 00 00 00  e9 3a da 50 fd 7f 00 00  |.........:.P....|
00000100  1a 00 00 00 00 00 00 00  02 00 00 00 00 00 00 00  |................|
00000110  1f 00 00 00 00 00 00 00  ea 5f da 50 fd 7f 00 00  |........._.P....|
00000120  0f 00 00 00 00 00 00 00  f9 3a da 50 fd 7f 00 00  |.........:.P....|
00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000140

/proc/‹pid›/cgroup

cgroups, к которым принадлежит данный процесс. Файл cgroup содержит zeor или более строк в виде:

hierarchy_id:controller_list:cgroup_path

Пример переформатированного содержимого этого файла следующий:

$ cat cgroup
11:hugetlb:/
10:net_cls,net_prio:/
9:memory:/
8:devices:/
7:perf_event:/
6:blkio:/
5:freezer:/
4:cpu,cpuacct,cpuset:/daemons
3:cpuset:/
2:pids:/
1:name=systemd:/user.slice/user-1001.slice/session-2239.scope

Используйте 4:cpu,cpuacct,cpuset:/daemons в качестве примера, поля, разделенные двоеточиями, слева направо:

  • Для иерархий cgroups версии 1 это поле содержит уникальный идентификационный номер иерархии, который можно сопоставить с идентификатором иерархии в /proc/cgroups. Для иерархии cgroups версии 2 это поле содержит значение 0.
  • Для иерархий cgroups версии 1 это поле содержит разделенный запятыми список контроллеров, привязанных к иерархии. Для иерархии cgroups версии 2 это поле пусто.
  • Это поле содержит путь к контрольной группе в иерархии, к которой принадлежит процесс. Это имя пути относится к точке монтирования иерархии.

/proc/‹pid›/clear_refs

Файл только для записи, доступный для записи только владельцу процесса и присутствующий только в том случае, если параметр конфигурации ядра CONFIG_PROC_PAGE_MONITOR включен.

/proc/‹pid›/cmdline

Завершить команду для запуска текущего процесса, но этот файл в каталоге зомби-процесса не содержит никакой информации. Например, процесс sshd cmdline будет выглядеть так:

$ cat cmdline
/usr/sbin/sshd-D

/proc/‹pid›/comm

Этот файл предоставляет значение comm процесса, т. е. имя команды, связанное с процессом. Различные потоки в одном и том же процессе могут иметь разные значения comm. Все еще используйте процесс sshd в качестве примера, его значение comm выглядит так:

$ cat comm
sshd