Досліджуємо процеси. Частина 1, Unix, Операційні системи, статті

Станіслав Лапшанскій

Які бувають процеси, як їх відрізнити і як з ними працювати.

Стаття є перекладом тексту Dru Lavigne.

У цій статті, складається з двох частин, я хочу розповісти вам про процеси. У цій частині ми дізнаємося, що таке процес і як подивитися інформацію про ваших процесах. У наступній частині ми подивимося, як зробити небудь корисне з цією інформацією.

Як будь-яка інша UNIX-система, FreeBSD є багатозадачною, розрахованої на багато користувачів операційною системою. Це означає, що кілька користувачів можуть виконувати декілька програм одночасно. Ядро системи відповідає за те, що кожна з цих програм гарантовано отримає процесорний час, і що кожен користувач побачить вірні результати, видані цими програмами.

Коли ви запускаєте програму, вона завантажується в оперативну пам’ять, і після цього її називають процесом, так як її інструкції вимагають обробки (процесу) процесором. Для того, щоб ядро ​​могло розібратися який користувач запускав якісь програми, кожному процесу присвоюється ідентифікатор ID (інакше PID – process ID). Зазвичай PID асоціюється с, і має такі ж права, як користувач, який запустив програму і як група до якої належить цей користувач.

Не всі програми запускаються користувачами, деякі з них запускаються вашої FreeBSD під час старту системи і називаються демонами. У свою чергу деякі програми, або запускаються іншими програмами, або є екземплярами самих себе. Первісну програму називають батьківським процесом, а створювані ним процеси – дітьми.

Коли ви встановили FreeBSD, для вас була створена файлова система процесів (procfs). Якщо ви надрукуєте:

$ more /etc/fstab

серед іншого, ви повинні будете побачити наступні рядки:

# Device Mountpoint FStype Options Dump Pass#
proc /proc procfs rw 0 0

Коли ви переглядаєте інформацію про вільному просторі на ваших дисках, ви можете помітити, що ця файлова система завжди заповнена на 100%:

$ df
Filesystem Size Used Avail Capacity Mounted on
procfs 4.0K 4.0K 0B 100% /proc

Це нормально, так як файлова система процесів не призначена для зберігання файлів, що створюються користувачами. Ця файлова система використовується командами ps і w для отримання інформації про запущені процесах. Зверніть увагу, що файлова система процесів змонтована в каталозі / proc. Давайте подивимось на вміст / proc використовуючи команду ls з ключем для сортування виведення по стовпцях і з ключем & ltF> для друку каталогів із слешем ():

$ cd /proc
$ ls -CF
./ 175/ 2072/ 301/ 315/
../ 176/ 227/ 307/ 316/
0/ 177/ 261/ 308/ 317/
1/ 178/ 27/ 309/ 318/
110/ 181/ 273/ 310/ 319/
163/ 197/ 290/ 311/ 320/
166/ 199/ 292/ 312/ 4/
171/ 2/ 3/ 313/ 5/
173/ 202/ 30/ 314/ curproc@

Зауважте, що кожен запис, крім однієї, це каталог з ім'ям складається з цифр. Ці числа відповідають ідентифікаторів PID запущених процесів. Останній запис, curproc, це символьне посилання, оскільки вона закінчується знаком <@>. Для того що б зрозуміти на який файл вказує це посилання, надрукуйте:

$ file curproc
curproc: symbolic link to 2072

Це означає, що посилання curproc вказує на якийсь процес. Якщо ви напишете:

$ man 5 procfs

ви зможете прочитати, що насправді curproc вказує на поточний процес, який звертається до системи / proc. Таким чином моя команда ls мала ідентифікатор PID рівний 2072.

Тепер давайте подивимося яка інформація зберігається про кожного запущеному процесі, шляхом перегляду вмісту одного з цих каталогів:

$ ls -CF 197
./ ctl file@ mem regs
../ dbregs fpregs note rlimit
cmdline etype map notepg status

Всі записи - це звичайні файли, виключаючи символьну посилання з ім'ям file. Однак ми абсолютно не уявляємо собі які дані містять ці файли. Спробуємо дізнатися:

$ file *
cmdline: empty
ctl: empty
dbregs: MS Windows COFF Unknown CPU
etype: empty
file: symbolic link to /usr/sbin/inetd
fpregs: data
map: empty
mem: empty
note: empty
notepg: empty
regs: data
rlimit: empty
status: empty

Мабуть це не виглядає так, як якщо б ми могли подивитися ці файли самі, оскільки вони не містять читабельного тексту. Це створює відчуття, що ця файлова система зберігає дані корисні для ядра системи. Проте, не дивлячись на те, що ви не зможете подивитися дані безпосередньо, ви можете скористатися утилітами w і ps, які знають як інтерпретувати і показати інформацію міститься в цих файлах.

Почнемо з команди w:

$ whatis w
w(1) - display who is logged in and what they are doing w (1) - показує хто зараз знаходиться в системі і що вони роблять
$ w
10:43AM up 17:50, 4 users, load averages: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE WHAT
genisis v0 - 9:46AM - w
genisis v1 - Sat04PM 2:02 -csh (csh)
genisis v2 - Sat08PM - -csh (csh)
genisis v3 - Sat05PM 2:02 -csh (csh)

Перший рядок показує поточний системний час, потім час безперервної роботи вашої системи з останньої перезавантаження, кількість користувачів, в даний момент знаходяться в системі і середня кількість завдань у черзі на обробку за 1, 5, 15 останніх хвилин.

Решта рядки показують реєстраційні імена користувачів, назви терміналів з яких зайшли ці користувачі, час заходу користувачів в систему, час минув після останнього натискання користувачем небудь клавіші і ім'я і параметри поточного користувача процесу.

Якщо ми скористаємося командою w з ключем & ltd>, то ми отримаємо трохи відрізняється висновок, оскільки w буде показувати всі процеси які користувач виконує з його терміналу:

w -d
10:55AM up 18:02, 4 users, load averages: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE WHAT
2100 -csh (csh)
2104 su (csh)
2235 w -d
genisis v0 - 9:46AM - w -d
313 -csh (csh)
genisis v1 - Sat04PM 2:14 -csh (csh)
314 -csh (csh)
genisis v2 - Sat08PM - -csh (csh)
315 -csh (csh)
genisis v3 - Sat05PM 2:14 -csh (csh)

Числа над назвою терміналу це ідентифікатори PID процесів. Якщо ви подивитеся на сторінку керівництва по команді w, то ви дізнаєтеся, що це відмінна утиліта для того що б швидко подивитися хто зараз, і з яких терміналів, знаходиться в системі і що вони роблять. Однак вона не призначена для детального з'ясування інформації про процеси, так як це робота утиліти ps. Якщо ви просто напишете:

ps

ви отримаєте базову інформацію про процеси, які ви запустили, приблизно ось так:

PID TT STAT TIME COMMAND
2100 v0 Ss 0:00.13 -csh (csh)
2286 v0 R+ 0:00.00 ps
313 v1 Is+ 0:00.13 -csh (csh)
314 v2 Is+ 0:00.21 -csh (csh)
315 v3 Is 0:00.12 -csh (csh)

Якщо читати видачу зліва направо, то команда ps показує PID, назва та тип терміналу, стан, витрачений процесорний час (підсумовуючи системне і користувальницьке час) і асоційовану команду, для процесів, які запущені користувачем виконує команду ps.

<Стан>, це новий термін, який надає різну інформацію про запущеному процесі. При читанні стовпця стану (STAT), перша буква показує поточний режим виконання процесу. Можливі значення цієї літери:

D - процес знаходиться в очікуванні дискової (або коротше, непрериваемой) операції I - процес в виклик режимі (процес <спить> більше 20 секунд) J - процес в <в'язниці> (див. man 2 jail - прим. Перекладача) R - процес виконується S - процес <спить> менше 20 секунд T - процес зупинений Z - мертвий (зомбі) процес

Отже у мене виконується один процес (сама команда ps), одна оболонка csh, яка нічого не робила останні 20 секунд і три оболонки, які нічого не роблять більше 20 секунд. Символ <+> показує що три моїх процесу виконуються на передньому плані (foreground-процеси), & lts> говорить про те, що чотири моїх процесу є початковими в сеансі. Не турбуйтеся, якщо деяка інформація про стан процесу не представляється вам важливою, дійсно, якщо ви не програміст, то деяка її частина не буде вам потрібна.

Майте на увазі, що команда ps без ключів, за замовчуванням покаже вам тільки ваші процеси, для того що б подивитися процеси всіх користувачів запущені на вашому комп'ютері, використовуйте ключ & lta>:

ps -a
PID TT STAT TIME COMMAND
2100 v0 Ss 0:00.18 -csh (csh)
2403 v0 R+ 0:00.00 ps -a
313 v1 Is+ 0:00.13 -csh (csh)
314 v2 Is+ 0:00.25 -csh (csh)
315 v3 Is+ 0:00.12 -csh (csh)
316 v4 Is+ 0:00.01 /usr/libexec/getty Pc ttyv4
317 v5 Is+ 0:00.01 /usr/libexec/getty Pc ttyv5
318 v6 Is+ 0:00.01 /usr/libexec/getty Pc ttyv6
319 v7 Is+ 0:00.01 /usr/libexec/getty Pc ttyv7

Ви можете вирішити, що більш зручно бачити які користувачі запустили яку команду, для цього скористайтеся ключем & ltu>:

ps -au
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
genisis 2404 0.0 0.2 428 244 v0 R+ 12:26PM 0:00.00 ps -au
root 273 0.0 0.4 620 448 con- I+ 4:53PM 0:00.02 /bin/sh /usr/loc
root 292 0.0 0.4 624 452 con- I+ 4:53PM 0:00.01 /bin/sh /usr/loc
genisis 313 0.0 0.8 1328 944 v1 Is+ 4:53PM 0:00.13 -csh (csh)
genisis 314 0.0 0.8 1336 960 v2 Is+ 4:53PM 0:00.25 -csh (csh)
genisis 315 0.0 0.8 1328 944 v3 Is+ 4:53PM 0:00.12 -csh (csh)
root 316 0.0 0.5 920 628 v4 Is+ 4:53PM 0:00.01 /usr/libexec/get
root 317 0.0 0.5 920 628 v5 Is+ 4:53PM 0:00.01 /usr/libexec/get
root 318 0.0 0.5 920 628 v6 Is+ 4:53PM 0:00.01 /usr/libexec/get
root 319 0.0 0.5 920 628 v7 Is+ 4:53PM 0:00.01 /usr/libexec/get
genisis 2100 0.0 0.8 1336 960 v0 Ss 9:46AM 0:00.19 -csh (csh)

Мені здалося, що читати висновок команди ps простіше, якщо я скористаюся ключем <з>, який не виводить шлях до команд, а показує тільки ім'я:

ps -auc
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
genisis 2414 0.0 0.2 428 244 v0 R+ 12:31PM 0:00.00 ps
root 273 0.0 0.4 620 448 con- I+ 4:53PM 0:00.02 sh
root 292 0.0 0.4 624 452 con- I+ 4:53PM 0:00.01 sh
genisis 313 0.0 0.8 1328 944 v1 Is+ 4:53PM 0:00.13 csh
genisis 314 0.0 0.8 1336 960 v2 Ss+ 4:53PM 0:00.26 csh
genisis 315 0.0 0.8 1328 944 v3 Is+ 4:53PM 0:00.12 csh
root 316 0.0 0.5 920 628 v4 Is+ 4:53PM 0:00.01 getty
root 317 0.0 0.5 920 628 v5 Is+ 4:53PM 0:00.01 getty
root 318 0.0 0.5 920 628 v6 Is+ 4:53PM 0:00.01 getty
root 319 0.0 0.5 920 628 v7 Is+ 4:53PM 0:00.01 getty
genisis 2100 0.0 0.8 1336 960 v0 Ss 9:46AM 0:00.21 csh

Проте, поки ми не бачимо всі процеси, які запущені на цій машині. Для того що б подивитися які запущені демони скористаємося ключем & ltx>. Висновок швидше за все буде довгим, тому перенаправимо його команді more:

ps -aucx | more
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
genisis 2417 0.0 0.2 428 244 v0 R+ 12:32PM 0:00.00 ps
root 1 0.0 0.2 532 304 ?? ILs Sat11AM 0:00.06 init
root 2 0.0 0.0 0 0 ?? DL Sat11AM 0:00.11 pagedaemon
root 3 0.0 0.0 0 0 ?? DL Sat11AM 0:00.00 vmdaemon
root 4 0.0 0.0 0 0 ?? DL Sat11AM 0:00.20 bufdaemon
root 5 0.0 0.0 0 0 ?? DL Sat11AM 0:09.53 syncer
root 27 0.0 2.0 70780 2540 ?? ILs Sat11AM 0:00.08 mount_mfs
root 30 0.0 0.1 208 92 ?? Is Sat11AM 0:00.00 adjkerntz
root 110 0.0 0.3 536 368 ?? Is 4:53PM 0:00.03 dhclient
root 163 0.0 0.5 904 608 ?? Ss 4:53PM 0:00.53 syslogd
daemon 166 0.0 0.4 916 556 ?? Is 4:53PM 0:00.01 portmap
root 181 0.0 0.5 263052 576 ?? Is 4:53PM 0:00.00 rpc.statd
root 197 0.0 0.6 1028 764 ?? Is 4:53PM 0:00.02 inetd
root 199 0.0 0.6 956 700 ?? Is 4:53PM 0:00.64 cron
root 202 0.0 1.0 1424 1216 ?? Is 4:53PM 0:00.66 sendmail
root 227 0.0 0.4 876 488 ?? Is 4:53PM 0:00.34 moused
root 273 0.0 0.4 620 448 con- I+ 4:53PM 0:00.02 sh
root 292 0.0 0.4 624 452 con- I+ 4:53PM 0:00.01 sh
genisis 313 0.0 0.8 1328 944 v1 Is+ 4:53PM 0:00.13 csh
genisis 314 0.0 0.8 1336 960 v2 Ss+ 4:53PM 0:00.26 csh
genisis 315 0.0 0.8 1328 944 v3 Is+ 4:53PM 0:00.12 csh
root 316 0.0 0.5 920 628 v4 Is+ 4:53PM 0:00.01 getty
root 317 0.0 0.5 920 628 v5 Is+ 4:53PM 0:00.01 getty
root 318 0.0 0.5 920 628 v6 Is+ 4:53PM 0:00.01 getty
root 319 0.0 0.5 920 628 v7 Is+ 4:53PM 0:00.01 getty
genisis 2100 0.0 0.8 1336 960 v0 Ss 9:46AM 0:00.21 csh
root 2239 0.0 3.6 5012 4512 ?? Ss 10:57AM 0:00.40 perl
root 2240 0.0 3.6 5012 4512 ?? I 10:57AM 0:00.02 perl
root 0 0.0 0.0 0 0 ?? DLs Sat11AM 0:00.06 swapper

Ось це так! Не дивно, що ядру доводиться давати кожному процесу свої ідентифікатор для того що б відслідковувати все що твориться у вашій FreeBSD. Якщо при багатосторінковому виведення вам важко запам'ятати який стовпець що означає, скористайтеся ключем & lth>, для того що б змусити команду ps переписувати заголовки стовпців при багатосторінковому висновку.

Ви могли помітити, що склад стовпців виведення розширився, коли ми додали ключ & ltu>, з знову з'явилися, найбільш цікаві стовпці <% CPU> і <% MEM>. Час від часу вам може знадобитися відсортувати висновок команди ps в порядку зменшення використання пам'яті або процесора, а не по ідентифікаторів. Для сортування за розміром використовуваної пам'яті застосовується ключ & ltm>, а по використовуваному процесорного часу - ключ & ltr>.

ps -m
PID TT STAT TIME COMMAND
314 v2 Ss+ 0:00.28 -csh (csh)
2100 v0 Ss 0:00.27 -csh (csh)
313 v1 Is+ 0:00.14 -csh (csh)
315 v3 Is+ 0:00.12 -csh (csh)
2570 v0 R+ 0:00.00 ps -m
ps -r
PID TT STAT TIME COMMAND
313 v1 Is+ 0:00.14 -csh (csh)
314 v2 Ss+ 0:00.28 -csh (csh)
315 v3 Is+ 0:00.12 -csh (csh)
2100 v0 Ss 0:00.27 -csh (csh)
2571 v0 R+ 0:00.00 ps -r

Ключі команди ps, які я описав, на практиці використовуються найбільш часто. Ви можете почитати посібник з командою ps для того, щоб дізнатись про інших ключах, і після цього вибрати комбінацію ключів, яка б найбільш відповідала вашим потребам.

Коли ви використовуєте команду ps, ви можете побачити процеси, про які ніколи раніше не чули. В цьому випадку, для того що б знайти сторінку керівництва, здатну пролити світло на таємницю, використовуйте команду whatis. Наприклад, будучи дуже цікавим суб'єктом, я спробував наступне:

whatis init syncer adjkerntz inetd portmap rpc.statd
init(8) - process control initialization (Процес контролюючий ініціалізацію)
syncer(4) - filesystem synchronizer kernel process (Процес ядра синхронізуючий файлову систему)
adjkerntz(8) - adjust local time CMOS clock to reflect time zone
changes and keep current timezone offset for the kernel (Налаштовує годинник комп'ютера згідно зі змінами годинного пояса, а так само зберігає поточне зміщення щодо часового поясу для ядра) inetd.conf (5), inetd (5) - internet super-server (інтернет-суперсервери)
portmap(8) - RPC program, version to DARPA port mapper (Програма RPC, версія DARPA розподільника портів) rpc.statd (8) - host status monitoring daemon (демон моніторингу системи)

Це змусило мене на деякий час зайнятися читанням. Це повинно дати і вам багато приводів для занять перед наступною частиною цієї статті, в якій ми подивимося, що ми можемо зробити з цими новими знаннями.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*