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 - стандартний потік помилок.