Процеси UNIX

Оболонка здійснює чимало інших операцій крім організації конвеєрів Давайте ненадовго звернемося до основ одночасного виконання декількох програм, про який згадувалося в попередньому розділі Наприклад, можна запустити дві програми в одній командному рядку, розділивши їх крапкою з комою оболонка розпізнає крапку з комою і розбиває рядок на дві команди:

$ date  who

Tue Sep 27 01:03:17  EDT  1983

ken

tty0

Sep 27 00:43

dmr

tty1

Sep 26 23:45

rob

tty2

Sep 26 23:59

bwk

tty3

Sep 27 00:06

jj

tty4

Sep 26 23:31

you

tty5

Sep 26 23:04

ber

tty7

Sep 26 23:34

$

Перш ніж оболонка видала нове запрошення на введення, виконалися обидві команди (послідовно)

Кілька програм можуть виконуватися і одночасно Припустимо, треба зробити щось, що віднімає багато часу, наприклад підрахувати кількість слів у книзі, при цьому вам не хотілося б чекати закінчення виконання команди wc для того, щоб запустити какуюто іншу програму Щоб добитися цього, введіть

$ wc ch* &gtwcout  &amp

$

Знак амперсанда & в кінці командного рядка повідомляє оболонці, що слід «почати виконання цієї програми, а потім приймати нові команди з терміналу негайно», тобто не чекати завершення роботи програми Таким чином, команда починає виконуватися, і поки вона виконується, можна робити щось ще Якщо на-

1 Швидше за все, буде надруковано щось подібне до [1] 6944 – Прямуючи науч ред

правити висновок у файл wcout, то він не буде заважати вашій роботі під час виконання цієї команди

Примірник виконується програми називається процесом Чис ло, що виводиться оболонкою для команди, запущеної зі знаком &, називається ідентифікатором процесу з його допомогою можна в інших командах посилатися на конкретну поточну програму

Важливо розрізняти програми і процеси Наприклад, wc – це програма кожен раз, коли вона запускається, створюється новий процес Якщо одночасно працюють кілька примірників однієї програми, то кожен з них являє собою окремий процес зі своїм ідентифікатором (і все ідентифікатори різні)

Якщо конвеєр ініціюється із застосуванням &, наприклад

$ pr  ch* | lpr  &amp

6951                        Ідентифікатор процесу lpr

$

то всі вхідні в нього процеси запускаються одночасно – знак & ставиться до всього конвеєру Але ідентифікатор виводиться тільки один – для останнього процесу з послідовності

Команда

$ wait

чекає, поки не виконаються всі процеси, ініційовані з використанням & Так що якщо вона не повертається негайно ж, значить ваші програми все ще працюють Команду wait можна перервати, натиснувши Delete

Використовуючи ідентифікатор, виведений оболонкою, можна зупинити процес, ініційований зі знаком &:

$ kill 6944

Якщо ви забули значення ідентифікатора, використовуйте команду ps для отримання відомостей про всі виконуються програмах Якщо ситуація виглядає безнадійною, kill 0 зупинить всі ваші процеси, крім того примірника оболонки, в якому ви зареєструвалися Якщо ж цікаво дізнатися, чим займаються інші користувачі, введіть ps-ag1 і отримаєте інформацію про всі процеси, що виконуються в цей момент Наведемо приклад такого висновку:

$ ps  -ag

PID TTY  TIME  CMD

36  co    6:29  /etc/cron 6423  5      0:02  –sh

6704 1     0:04  –sh

6722 1     0:12  vi  paper

1 Швидше, ps-ax для BSD і ps-ef для System V – Прямуючи науч ред

4430 2     0:03  –sh

6612  7      0:03  –sh 6628  7      1:13  rogue

6843 2     0:02  write  dmr

6949 4     0:01  login  bimmler

6952 5     0:08  pr  ch11  ch12  ch13  ch14 6951  5     0:03  lpr

6959  5      0:02  ps  –ag 6844  1      0:02  write  rob

$

PID – це ідентифікатор процесу (process-id) TTY – термінал, свя занний з процесом (як у who) TIME – час використання процесора в хвилинах і секундах а в кінці кожного рядка виведена що виконується команда Команда ps в різних версіях системи виконується по-різному, тому на деяких компютерах висновок може бути відформатований інакше Навіть аргументи можуть бути іншими – див сторінку ps (1) в керівництві (man)

Процеси мають такий же тип ієрархічної структури, як і фай ли: у кожного процесу є породжує (батьківський) процес, кожен процес може породжувати процеси Ваш екземпляр оболоч ки був створений процесом, повязаним з терміналом, з якого був здійснений вхід в систему Коли ви запускаєте команди, ці процеси стають прямими нащадками оболонки Якщо запустити програму з одного з них, використовуючи, наприклад, для виходу в оболоч ку з ed, породжується новий процес, який, отже, є онуком оболонки

Іноді процесу потрібно так багато часу на виконання, що виникає бажання запустити його, потім вимкнути термінал і піти, не чекаючи завершення Однак якщо вимкнути термінал або перервати зєднання, то процес, як правило, буде убитий, навіть якщо ука зать знак & Спеціально для таких ситуацій створили команду nohup (no hangup – не реагувати на розрив лінії) Якщо ввести

$ nohup команда &

то виконання команди буде продовжено навіть після виходу з системи Весь висновок команди зберігається у файлі nohupout Способу здійснити nohup команди заднім числом не існує

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

$ nice команда5требующая5огромных5ресурсов &

Програма nohup автоматично викликає nice, адже якщо користувач все одно йде, він може дозволити програмі виконуватися трохи більш повільно

І останній варіант – можна сказати системі, щоб вона запустила процес, наприклад рано вранці, коли нормальні люди ще сплять, а не сидять за компютером Для цього існує команда at (1):

$ at час будь-які команди .. ctld

$

Команди можуть вводитися не тільки з терміналу, а й з файлу:

$ at  3am  &ltfile

$

Час може бути зазначено як в 24-годинному форматі, наприклад 2130, так і в 12-годинному, наприклад 930pm

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

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


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

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

Ваш отзыв

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

*

*