1. Информация о процессах

Если вы выведете список содержимого каталога /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
#

Каждый из каталогов содержит одинаковые пункты: Вот краткое описание некоторых из них:

  1. cmdline: этот (псевдо-) файл содержит полную командную строку, использованную для вызова процесса. Он не отформатирован: между программой и её аргументами нет пробелов, а в конце строки нет символа окончания строки. Чтобы просмотреть его, вы можете использовать: perl -ple 's,\00, ,g' cmdline.

  2. cwd: эта символическая ссылка указывает на текущий рабочий каталог процесса (следует из имени).

  3. environ: этот файл содержит все переменные окружения, определённые для этого процесса, в виде ПЕРЕМЕННАЯ=значение. Как и в cmdline, вывод вообще не отформатирован: нет разделителей строк для отделения различных переменных, и в конце нет символа окончания строки. Одно из решений для его просмотра: perl -ple 's,\00,\n,g' environ.

  4. exe: эта символическая ссылка указывает на исполняемый файл, соответствующий запущенному процессу.

  5. fd: этот подкаталог содержит список файловых дескрипторов, открытых в данный момент процессом. Смотрите ниже.

  6. maps: когда вы выводите содержимое этого именованного канала (при помощи команды cat, например), вы можете увидеть части адресного пространства процесса, которые в текущий момент распределены для файла. Вот эти поля (слева направо): адресное пространство, связанное с этим распределением; права доступа, связанные с этим распределением; смещение от начала файла, где начинается распределение; старший и младший номера (в шестнадцатиричном виде) устройства, на котором находится распределенный файл; номер inode файла; и, наконец, имя самого файла. Если устройство обозначено как 0 и отсутствует номер inode или имя файла - это анонимное распределение. Смотрите mmap(2).

  7. root: эта символическая ссылка указывает на корневой каталог, используемый процессом. Обычно это будет /, однако рекомендуем вам просмотреть chroot(2).

  8. 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 - стандартный поток ошибок.