| |
— | procfs [2025/07/06 12:39] (текущий) – создано - внешнее изменение 127.0.0.1 |
---|
| ====== ProcFS файловая система для процессов (/proc) ====== |
| |
| {{htmlmetatags> |
| metatag-description=(procfs — специальная файловая система, используемая в UNIX-подобных операционных системах. Позволяет получить доступ к информации из ядра о системных процессах. Необходима для выполнения таких команд как ps, w, top.) |
| }} |
| |
| **ProcFS** — специальная файловая система, используемая в Linux, позволяет получить доступ к информации из ядра о системных процессах. Эта файловая система необходима для выполнения таких команд как [[ps]], w, [[top]]. |
| |
| **Процессы**: В любое время в Linux'е одновременно запущено множество процессов. Некоторые из них, такие как оконные менеджеры, email-клиенты и Web-браузеры, видны конечному пользователю. Другие, вроде серверов и вспомогательных процессов, в глаза не бросаются, но запущены в фоновом режиме, выполняя задания, не требующие каких-либо действий со стороны пользователя. Запуск "ps -ef" в shell'е выведет список всех запущенных на данный момент процессов. А выглядеть будет примерно так: |
| <file bash> |
| $ ps -ef |
| UID PID PPID C STIME TTY TIME CMD |
| root 1 0 0 11:08 ? 00:00:04 init |
| root 2 1 0 11:08 ? 00:00:00 [keventd] |
| root 3 0 0 11:08 ? 00:00:00 [ksoftirqd_CPU0] |
| root 4 0 0 11:08 ? 00:00:00 [kswapd] |
| root 5 0 0 11:08 ? 00:00:00 [bdflush] |
| root 6 0 0 11:08 ? 00:00:00 [kupdated] |
| root 8 1 0 11:08 ? 00:00:00 [kjournald] |
| root 86 1 0 11:08 ? 00:00:00 /sbin/devfsd /dev |
| root 165 1 0 11:09 ? 00:00:00 [kjournald] |
| root 168 1 0 11:09 ? 00:00:00 [khubd] |
| root 294 1 0 11:09 ? 00:00:00 [kapmd] |
| root 515 1 0 11:09 ? 00:00:00 metalog [MASTER] |
| root 521 515 0 11:09 ? 00:00:00 metalog [KERNEL] |
| root 531 1 0 11:09 ? 00:00:00 /sbin/dhcpcd eth0 /etc/X11/fs/config -droppriv -user xfs |
| root 572 1 0 11:09 ? 00:00:00 /usr/kde/2/bin/kdm |
| root 593 572 2 11:09 ? 00:04:27 /usr/X11R6/bin/X -auth /var/lib/kdm/authfiles/A:0-25pIgI |
| root 644 1 0 11:09 vc/1 00:00:00 /sbin/agetty 38400 tty1 linux |
| root 1045 572 0 12:16 ? 00:00:00 -:0 |
| mbutcher 1062 1045 0 12:16 ? 00:00:00 /bin/sh /etc/X11/Sessions/kde-2.2.2 |
| mbutcher 1091 1062 0 12:16 ? 00:00:00 /bin/bash --login /usr/kde/2/bin/startkde |
| mbutcher 1132 1 0 12:16 ? 00:00:00 kdeinit: Running… |
| mbutcher 1157 1132 0 12:16 ? 00:00:01 kdeinit: kwin |
| mbutcher 1159 1 0 12:16 ? 00:00:07 kdeinit: kdesktop |
| mbutcher 1168 1 0 12:16 ? 00:00:00 kdeinit: kwrited |
| mbutcher 1171 1168 0 12:16 pty/s0 00:00:00 /bin/cat |
| mbutcher 1173 1 0 12:16 ? 00:00:00 alarmd |
| mbutcher 1207 1132 0 12:23 ? 00:00:08 kdeinit: konsole -icon konsole -miniicon konsole |
| mbutcher 1219 1207 0 12:23 pty/s2 00:00:00 /bin/bash |
| mbutcher 1309 1260 0 13:48 pty/s3 00:00:01 vi dev-and-proc.html |
| root 1314 1220 0 14:03 pty/s2 00:00:00 ps -ef |
| </file> |
| Многие из задач в выводе ps являются процессами, работающими в фоновом режиме. Те, что взяты в квадратные скобочки — процессы ядра. Только некоторые, вроде процессов kde и записей в конце списка, являются процессами, с которыми я взаимодействую напрямую. |
| |
| Для управления системой ядро должно хранить информацию о каждом запущенном процессе, включая само себя. Также должна быть возможность просмотра сведений о запущенных приложениях пользовательского уровня (хорошим примером служит "ps", а также "top"). В файловой системе /proc ядро и хранит информацию о процессах. |
| |
| Как и DevFS, /proc хранится в памяти, а не на диске. Если вы посмотрите в файл /proc/mounts (в котором приводится список всех примонтированных файловых систем), то увидите строку вроде этой: |
| |
| <file> |
| proc /proc proc rw 0 0 |
| </file> |
| /proc контролируется ядром, у этой файловой системы нет «под собой» какого-либо устройства. Так как в ней в основном содержится информация, управляемая ядром, наиболее логичным место для хранения такой информации является память, также контролируемая ядром. |
| |
| Информация о запущенных процессах: Чтобы хранить информацию обо всех процессах, ядро присваивает каждому из них PID (Process ID — идентификатор процесса) в виде числа. Запуск команды "ps -ef" (см. выше) выведет список всех запущенных процессов в порядке их PID'ов (вторая колонка). Файловая система /proc хранит информацию о каждом PID. |
| |
| В /proc названиями многих каталогов являются числа. Эти директории ссылаются на номера PID. В таких каталогах находятся файлы, которые предоставляют подробную информацию о положении, окружении и прочих деталях процесса. В выводе ps (см. выше) была следующая строка: |
| |
| mbutcher 1219 1207 0 12:23 pty/s2 00:00:00 /bin/bash |
| Этот процесс — запущенный bash shell, имеющий PID 1219. Каталог /proc/1219 содержит информацию об этом процессе. |
| |
| $ ls /proc/1219 |
| cmdline cpu cwd environ exe fd maps mem root stat statm status |
| В файле «cmdline» располагается команда, которая вызвала процесс. В файле «environ» находятся данные о значениях окружения для процесса. «status» содержит информацию о статусе процесса, среди которой пользовательский (UID) и групповой (GID) идентификаторы для пользователя, запустившего процесс, идентификатор родительского процесса (parent process ID — PPID) и текущий статус процесса (например, «Sleep» или «Running»). |
| |
| <file> |
| $ cat status |
| Name: bash |
| State: S (sleeping) |
| Tgid: 1219 |
| Pid: 1219 |
| PPid: 1207 |
| TracerPid: 0 |
| Uid: 501 501 501 501 |
| Gid: 501 501 501 501 |
| FDSize: 256 |
| Groups: 501 10 18 |
| VmSize: 2400 kB |
| VmLck: 0 kB |
| VmRSS: 1272 kB |
| VmData: 124 kB |
| VmStk: 20 kB |
| VmExe: 544 kB |
| VmLib: 1604 kB |
| SigPnd: 0000000000000000 |
| SigBlk: 0000000080010000 |
| SigIgn: 8000000000384004 |
| SigCgt: 000000004b813efb |
| CapInh: 0000000000000000 |
| CapPrm: 0000000000000000 |
| CapEff: 0000000000000000 |
| </file> |
| У каждого каталога процесса есть несколько символических ссылок. «cwd» ссылается на текущий рабочий каталог для процесса. «exe» — ссылка на исполняемую программу процесса, а «root» ссылается на каталог, который процесс рассматривает как корневой (обычно «/»). В каталоге «fd» содержится список символических ссылок на дескрипторы файлов, используемых процессом. |
| |
| Существуют и другие файлы в каталоге процесса, предоставляющие исчерпывающую информацию: от занятности процессора и памяти до количества времени, которое запущен процесс. Большая часть этих файлов описана в документации исходников ядра («Documentation/file systems/proc.txt»), а также доступна в man — "man proc". |
| |
| Информация о ядре: Кроме хранения сведений о процессах, файловая система /proc содержит множество информации, самостоятельно созданной ядром для описания общего состояния системы. |
| |
| Ядро и модули могут создавать файлы в /proc для того, чтобы предоставить информацию о своем текущем состоянии. Например, /proc/fb показывает, какие сейчас доступны устройства типа frame buffer (буферы фреймов обычно используются для отображения загрузочного логотипа). |
| |
| $ cat fb |
| 0 VESA VGA |
| Обратите внимание, что 0 ссылается на индекс frame buffer'а и устройство /dev/fb0. Если бы у меня был второй framebuffer, то появилась бы еще и строка с 1, соответствующая /dev/fb1. Часто данные proc ссылаются на устройства в /dev. |
| |
| В /proc хранится немало информации о железе. В файле /proc/pci написано про все обнаруженные в системе PCI устройства. Запуск команды "[[lspci]]" выводит идентичную информацию, так как использует /proc/pci для получения сведений об устройствах. В /proc/bus находятся каталоги для bus-архитектур (PCI, PCCard, USB), в которых содержится информация об устройствах, присоединенных таким образом (PCI, PCCard, USB). Информация о сети располагается в /proc/net. Информацию о жестких дисках можно найти в /proc/ide и /proc/scsi (в зависимости от типа устройства). В /procs/devices присутствует список всех устройств системы (они разделены на две категории: «block» — блочные, «character» — символьные). |
| |
| <file> |
| $ cat /proc/devices |
| Character devices: |
| 1 mem |
| 2 pty/m%d |
| 3 pty/s%d |
| 4 tts/%d |
| 5 cua/%d |
| 7 vcs |
| 10 misc |
| 14 sound |
| 29 fb |
| 116 alsa |
| 162 raw |
| 180 usb |
| 226 drm |
| 254 pcmcia |
| |
| Block devices: |
| 1 ramdisk |
| 2 fd |
| 3 ide0 |
| 22 ide1 |
| </file> |
| |
| В действительности, в /proc находится намного больше файлов, чем было описано здесь. У каждого ядра они могут несколько различаться, в зависимости от того, что было включено в ядро, какое железо и программное обеспечение используется и в каком состоянии в настоящий момент находится компьютер. К некоторым из этих файлов постоянно обращается машина, а другие предоставляют «интуитивную» информацию. |
| |
| Работа с процессами через /proc: Некоторые файлы /proc предназначены не только для чтения. Запись в них может влиять на состояние ядра. Просмотр содержимого файла в /proc обычно безопасно, но запись в них без точной уверенности в своих действиях может приводить к фатальным последствиям. Несмотря на это, иногда запись в /proc — единственный способ связи с ядром. |
| |
| Например, в некоторых версиях ядра присутствует опция включения Web-сервера (khttp), работающего на уровне ядра. Из-за того, что запуск Web-сервера по умолчанию является риском с точки зрения безопасности, khttp требует записи в /proc для запуска. |
| |
| <file> |
| echo 1 > /proc/sys/net/khttpd/start |
| </file> |
| Когда ядро видит, что содеримое /proc/sys/net/khttps/start меняется с 0 (по умолчанию) на 1, оно запускает сервер khttpd. |
| |
| Существуют десятки других настраиваемых параметров в /proc — некоторые для конфигурации железа, другие для управления ядром. Однако, многие из них являются низкоуровневыми и могут привести к печальным последствиям, если указать неправильные значения. Поэтому, если вы твердо не уверены в своих действиях, менять параметры в /proc строго не рекомендуется. |
| |
| * **Вывод** |
| |
| /proc и /dev представляют интерфейсы к внутренностям Linux'а с помощью файлов. Они способствуют настройке и получению сведений об устройствах и процессах системы. Благодаря ним, можно с легкостью обновлять, изучать, запускать систему и устранять разнообразные неполадки. Понимание и применение знаний этих двух файловых систем являются ключом к созданию «более вашей» Linux-системы. |
| ====== Описание файлов и директории из ProcFS ====== |
| |
| * /proc/PID/cmdline – аргументы командной строки (где PID – идентификатор процесса или self); |
| * /proc/PID/environ – переменные окружения для данного процесса; |
| * /proc/PID/status – статус процесса; |
| * /proc/PID/fd – директория, содержащая символьные ссылки на каждый открытый файловый дескриптор; |
| * /proc/cpuinfo – информация о процессоре (производитель, модель, поколение и т.п.); |
| * /proc/cmdline – параметры, передаваемые ядру при загрузке; |
| * /proc/uptime – количество секунд, прошедших с момента загрузки ядра и проведенных в режиме бездействия; |
| * /proc/version – содержит информацию о версии ядра, компилятора и другую информацию, связанную с загруженным ядром. |
| * /proc/sys/fs/file-max - показывает предел Max Open File Limit (обозначающий число одновременно открытых файлов) |
| * /proc/sys/fs/file-nr - по порядку параметр выдает три значения: число открытых в данный момент файлов; число открытых, но не используемых файлов; максимальное число открытых файлов |
| |
| Читайте также: [[ulimit]]; [[sysctl]] |