Якщо ви виведете список з вмістом каталогу /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
- стандартний потік помилок.