Если вы выведете список содержимого каталога /proc
, вы
увидите много каталогов, именами которых являются номера. Эти каталоги
содержат информацию о всех процессах в системе, запущенных в данный момент:
$ ls -d /proc/[0-9]* /proc/1/ /proc/302/ /proc/451/ /proc/496/ /proc/556/ /proc/633/ /proc/127/ /proc/317/ /proc/452/ /proc/497/ /proc/557/ /proc/718/ /proc/2/ /proc/339/ /proc/453/ /proc/5/ /proc/558/ /proc/755/ /proc/250/ /proc/385/ /proc/454/ /proc/501/ /proc/559/ /proc/760/ /proc/260/ /proc/4/ /proc/455/ /proc/504/ /proc/565/ /proc/761/ /proc/275/ /proc/402/ /proc/463/ /proc/505/ /proc/569/ /proc/769/ /proc/290/ /proc/433/ /proc/487/ /proc/509/ /proc/594/ /proc/774/ /proc/3/ /proc/450/ /proc/491/ /proc/554/ /proc/595/
Обратите внимание, что как пользователь, вы (рассуждая логически) можете
вывести информацию только о своих собственных процессах, но не других
пользователей. Поэтому войдите в систему под root
'ом и посмотрите,
какая информация доступна для процесса 1, которым является процесс
init и который отвечает за запуск всех остальных
процессов:
$ su Password: $ cd /proc/1 $ ls -l total 0 dr-xr-xr-x 2 root root 0 Feb 15 18:14 attr/ -r-------- 1 root root 0 Feb 15 18:14 auxv -r--r--r-- 1 root root 0 Feb 15 18:14 cmdline lrwxrwxrwx 1 root root 0 Feb 15 18:14 cwd -> // -r-------- 1 root root 0 Feb 15 18:14 environ lrwxrwxrwx 1 root root 0 Feb 15 18:14 exe -> /sbin/init* dr-x------ 2 root root 0 Feb 15 18:14 fd/ -r--r--r-- 1 root root 0 Feb 15 18:14 maps -rw------- 1 root root 0 Feb 15 18:14 mem -r--r--r-- 1 root root 0 Feb 15 18:14 mounts lrwxrwxrwx 1 root root 0 Feb 15 18:14 root -> // -r--r--r-- 1 root root 0 Feb 15 18:14 stat -r--r--r-- 1 root root 0 Feb 15 18:14 statm -r--r--r-- 1 root root 0 Feb 15 18:14 status dr-xr-xr-x 3 root root 0 Feb 15 18:14 task/ -r--r--r-- 1 root root 0 Feb 15 18:14 wchan $
Каждый из каталогов содержит одинаковые пункты: Вот краткое описание некоторых из них:
cmdline
: этот (псевдо-) файл содержит полную
командную строку, использованную для вызова процесса. Он не отформатирован:
между программой и ее аргументами нет пробелов, а в конце строки нет
разделителя строки. Чтобы просмотреть его, вы можете использовать:
perl -ple 's,\00, ,g' cmdline.
cwd
: эта символическая ссылка указывает на текущий
рабочий каталог процесса (следует из имени).
environ
: этот файл содержит все переменные окружения,
определенные для этого процесса, в виде
ПЕРЕМЕННАЯ=значение
. Как и в
cmdline
, вывод вообще не отформатирован: нет
разделителей строк для отделения различных переменных, и в конце нет
разделителя строки. Одно из решений для его просмотра: perl -ple
's,\00,\n,g' environ.
exe
: эта символическая ссылка указывает на
исполняемый файл, соответствующий запущенному процессу.
fd
: этот подкаталог содержит список файловых
дескрипторов, открытых в данный момент процессом. Смотрите ниже.
maps
: когда вы выводите содержимое этого именованного
канала (при помощи команды cat, например), вы можете
увидеть части адресного пространства процесса, которые в текущий момент
распределены для файла. Вот эти поля (слева направо): адресное пространство,
связанное с этим распределением; права доступа, связанные с этим
распределением; смещение от начала файла, где начинается распределение;
старший и младший номера (в шестнадцатиричном виде) устройства, на котором
находится распределенный файл; номер inode файла; и, наконец, имя самого
файла. Если устройство обозначено как 0 и отсутствует номер inode или имя
файла, тогда это анонимное распределение. Смотрите mmap(2).
root
:
эта символическая ссылка указывает на корневой каталог, используемый
процессом. Обычно это будет /
, однако рекомендуем вам
просмотреть chroot(2).
status
: этот файл содержит разнообразную информацию о
процессе: имя исполняемого файла, его текущее состояние, его PID и PPID,
его реальные и эффективные UID и GID, его использование памяти и другие
данные. Обратите внимание, что файлы stat
и
statm
теперь устарели. Информация, которая в них содержалась,
теперь хранится в status
.
Если мы выведем список содержимого каталога fd
для
случайно выбранного процесса, например, для процесса 127, мы получим
следующее:
$ ls -l /proc/127/fd total 0 lrwx------ 1 root root 64 Dec 16 22:04 0 -> /dev/console l-wx------ 1 root root 64 Dec 16 22:04 1 -> pipe:[128] l-wx------ 1 root root 64 Dec 16 22:04 2 -> pipe:[129] l-wx------ 1 root root 64 Dec 16 22:04 21 -> pipe:[130] lrwx------ 1 root root 64 Dec 16 22:04 3 -> /dev/apm_bios lr-x------ 1 root root 64 Dec 16 22:04 7 -> pipe:[130] lrwx------ 1 root root 64 Dec 16 22:04 9 -> /dev/console $
На самом деле это список дескрипторов файла, открытых процессом. Каждый открытый дескриптор представлен в виде символической ссылки, где имя - это номер дескриптора, который указывает на файл, открытый этим дескриптором[28]. Обратите внимание на права доступа к симлинкам: это - единственное место, где они имеют смысл, поскольку они представляют собой права, с которыми был открыт файл, соответствующий дескриптору.
[28]
Если вы помните, о чем говорилось в разделе Раздел 4, «Перенаправления и каналы»,
тогда вы должны знать, что означают дескрипторы 0
,
1
и 2
. Дескриптор
0
- это стандартный ввод, дескриптор
1
- стандартный вывод и дескриптор
2
- стандартный поток ошибок.