Если вы выведете список
содержимого каталога /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 -r-------- 1 root root 0 Aug 15 18:14 auxv -r--r--r-- 1 root root 0 Aug 15 18:14 cmdline lrwxrwxrwx 1 root root 0 Aug 15 18:14 cwd -> // -r-------- 1 root root 0 Aug 15 18:14 environ lrwxrwxrwx 1 root root 0 Aug 15 18:14 exe -> /sbin/init* dr-x------ 2 root root 0 Aug 15 18:14 fd/ -rw-r--r-- 1 root root 0 Aug 15 18:14 loginuid -r--r--r-- 1 root root 0 Aug 15 18:14 maps -rw------- 1 root root 0 Aug 15 18:14 mem -r--r--r-- 1 root root 0 Aug 15 18:14 mounts -rw-r--r-- 1 root root 0 Aug 15 18:14 oom_adj -r--r--r-- 1 root root 0 Aug 15 18:14 oom_score lrwxrwxrwx 1 root root 0 Aug 15 18:14 root -> // -rw------- 1 root root 0 Aug 15 18:14 seccomp -r--r--r-- 1 root root 0 Aug 15 18:14 stat -r--r--r-- 1 root root 0 Aug 15 18:14 statm -r--r--r-- 1 root root 0 Aug 15 18:14 status dr-xr-xr-x 3 root root 0 Aug 15 18:14 task/ -r--r--r-- 1 root root 0 Aug 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
для случайно
выбранного процесса мы получим следующее:
# ls -l /proc/8141/fd/ total 4 lrwx------ 1 peter peter 64 Aug 4 09:05 0 -> /dev/tty1 lrwx------ 1 peter peter 64 Aug 4 09:05 1 -> /dev/tty1 lrwx------ 1 peter peter 64 Aug 4 09:05 2 -> /dev/tty1 l-wx------ 1 peter peter 64 Aug 4 09:05 3 -> /home/peter/seti32/lock.sah #
На самом деле это список дескрипторов файла, открытых процессом. Каждый открытый дескриптор представлен в виде символической ссылки, где имя - это номер дескриптора, который указывает на файл, открытый этим дескриптором[7]. Обратите внимание на права доступа к симлинкам: это - единственное место, где они имеют смысл, поскольку они представляют собой права, с которыми был открыт файл, соответствующий дескриптору.
[7]
Если вы помните, о чем говорилось в
разделе Раздел 4, «Перенаправления и каналы», тогда вы должны
знать, что означают дескрипторы
0
, 1
и 2
.
Дескриптор 0
- это стандартный
ввод, дескриптор 1
-
стандартный вывод и дескриптор
2
- стандартный поток ошибок.