Все буде Україна!

Процеси в Linux. Управління процесами

  Юрій  | 

  Оновл. 29 Тра 2022  | 

 56

Процес — це екземпляр запущеної програми. Щоразу, коли в терміналі виконується якась команда (наприклад, команда pwd), система створює/запускає новий процес.

Типи процесів

У Linux існує три основні типи процесів:

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

   Фонові процеси (або автоматичні процеси”) — це процеси, які не підключені до терміналу; вони не очікують користувацького вводу даних. Таким чином, інші процеси можуть виконуватися паралельно з процесом, запущеним у фоновому режимі, оскільки їм не потрібно чекати на його завершення.

   Демони (англ. daemons”) — це особливий тип фонових процесів, які запускаються при старті системи та продовжують працювати у вигляді служби; вони не вмирають. Такі процеси запускаються як системні задачі (служби). Однак при цьому вони можуть керуватися користувачем через init-процес (про який ми поговоримо трохи згодом). Наприклад, до демонів відноситься служба електронних повідомлень sendmail і sshd (служба, яка приймає від клієнтів запити на з’єднання по протоколу ssh). За винятком процесу init та деяких інших, процеси демонів зазвичай мають закінчення d у своєму імені.

Як Linux ідентифікує процеси?

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

Процеси запущеної програми мають унікальний п’ятизначний номер — PID (скор. від Process IDentificator”“ідентифікатор процесу”), а також PPID (скор. від Parent Process IDentificator”“ідентифікатор батьківського процесу”). У зв’язку з цим процеси додатково поділяються на дві групи:

   Батьківські процеси — це процеси, які під час свого виконання створюють інші процеси.

   Дочірні процеси — це процеси, які створюються іншими процесами під час свого виконання.

Прабатьком всіх процесів у системі є процес init (від англ. initialization”) — перша програма, яка виконується при завантаженні Linux і керує всіма іншими процесами в системі. init запускається самим ядром і має PID = 1, тому в нього немає батьківського процесу.

Примітка: У будь-який час у системі немає двох процесів з однаковим PID. Новому процесу може бути призначено раніше використовуваний, але зараз вже вільний PID.

Стан процесу в Linux

Коли процес передає ядру запит, який не може бути виконаний відразу ж, процес “занурюється в сон/очікування” і “пробуджується”, коли запит може бути виконаний. У зв’язку з цим, залежно від поточної ситуації, процес під час свого виконання може переходити з одного стану в інший:

Розглянемо основні стани процесу:

   Виконання — процес або запущений (поточний процес в системі), або готовий до запуску (очікує передачі на виконання процесору).

   Очікування — процес очікує настання деякої події (користувацького вводу, сигналу від іншого процесу тощо) або виділення системних ресурсів. Крім того, ядро також розрізняє два типи очікуючих процесів:

   очікуючі процеси, які можуть бути перервані — можуть бути перервані сигналами;

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

   Завершений — процес був зупинений, як правило, шляхом отримання сигналу штатного завершення роботи exit().

   Зомбі — іноді, коли батьківський процес вбивається до завершення дочірнього процесу, дочірні процеси стають “осиротілими”, при цьому в якості нового батька (з відповідною зміною PPID) їм призначається процес init. Вбиті процеси, але які при цьому все ще відображаються в таблиці процесів, називають процесами зомбі (вони мертві і не використовуються).

Як отримати ідентифікатор (PID) процесу?

Для відображення ідентифікатора потрібного процесу можна використати команду pidof, наприклад:

$ pidof init
$ pidof bash
$ pidof systemd

Примітка: На вищенаведеному скріншоті ви можете бачити, що процесу init призначено PID=1, а процесу systemd — PID=881, хоча системою ініціалізації в Debian є саме systemd.

Щоб вивести PID та PPID поточної оболонки, виконайте:

$ echo $$
$ echo $PPID

Запуск інтерактивного процесу в Linux

Як тільки ви виконаєте якусь команду або програму (наприклад, firefox), вона створить у системі відповідний процес. Ви можете запустити процес переднього плану (він буде підключений до терміналу, очікуючи користувацького вводу) наступним чином:

$ firefox

Запуск фонового процесу в Linux

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

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

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

$ firefox &
$ jobs

Ви також можете відправити процес у фоновий режим, призупинивши його за допомогою поєднання клавіш Ctrl+Z. Дане поєднання клавіш надішле процесу сигнал SIGSTOP, тим самим перевівши його в режим очікування:

$ firefox #Після Enter натисніть Ctrl+Z
$ jobs

Щоб продовжити виконання вищезазначеної призупиненої команди в фоновому режимі, використовуйте команду bg (від англ. begin”):

$ bg

Щоб відправити фоновий процес на передній план, використовуйте команду fg (від англ. foreground”) разом з ідентифікатором завдання наступним чином:

$ jobs
$ fg %1

Відслідковування активних процесів

Існує кілька різних інструментів для перегляду/перерахування запущених у системі процесів. Двома традиційними та добре відомими з них є команди ps та top.

Команда ps

Відображає інформацію про активні процеси в системі, як показано на наступному скріншоті:

$ ps
$ ps -e | head #(head – фільтр, який відображає тільки перші 10 рядків виводу команди "ps -e")

Для отримання додаткової інформації про процеси, запущені поточним користувачем, застосовується опція -f:

$ ps -f

Стовпці, присутні у виводі команди ps, мають такі значення:

   UID — ідентифікатор користувача, якому належить процес (той, від чого імені відбувається виконання).

   PID — ідентифікатор процесу.

   PPID — ідентифікатор батьківського процесу.

   C — завантаження CPU процесом.

   STIME — час початку виконання процесу.

   TTY — тип терміналу, пов’язаного з процесом.

   TIME — кількість процесорного часу, витраченого на виконання процесу.

   CMD — команда, яка запустила цей процес.

Також можна відобразити інформацію по конкретному процесу, використавши команду ps -f [PID], наприклад:

$ ps -f 1208

Є і інші опції, які можна використати з командою ps:

   -a — показує інформацію про процеси по всім користувачам;

   -x — показує інформацію про процеси без терміналів;

   -u — показує додаткову інформацію про процес по заданому UID або імені користувача;

   -e — відображення розширеної інформації.

Якщо ви хочете вивести всю інформацію по всіх процесах системи, то використовуйте команду ps –aux:

Зверніть увагу на виділений заголовок. Команда ps підтримує функцію сортування процесів за відповідними стовпцями. Наприклад, щоб відсортувати список процесів по споживанню ресурсів процесора (у порядку зростання), введіть команду:

$ ps -aux --sort=%cpu

Результат:

Якщо ви хочете виконати сортування по споживанню пам’яті (у порядку спадання), то додайте до імені стовпця, що вас цікавить, знак мінуса:

$ ps -aux --sort=-%mem

Результат:

Ще один дуже популярний приклад використання команди ps — це об’єднання з командою grep для пошуку заданого процесу по його імені:

$ ps -aux | grep bash

Результат:

Команда top

Команда top відображає інформацію про запущені процеси в режимі реального часу:

$ top

Розглянемо детально:

   PID — ідентифікатор процесу.

   USER — користувач, якому належить процес.

   PR — пріоритет процесу на рівні ядра.

   NI — пріоритет виконання процесу від -20 до 19.

   VIRT — загальний обсяг (у кілобайтах) віртуальної пам’яті (фізична пам’ять самого процесу; завантажені з диска файли бібліотек; пам’ять, що спільно використовується з іншими процесами тощо), що використовується в даний момент.

   RES — поточний обсяг (в кілобайтах) фізичної пам’яті процесу.

   SHR — обсяг спільно використовуваної з іншими процесами пам’яті.

   S (скор. від STATUS”) — стан процесу:

   S (скор. від Sleeping”) — очікування, що переривається. Процес чекає настання події.

   I (скор. від Idle”) — процес не виконується.

   R (скор. від Running”) — процес виконується (або поставлений в чергу на виконання).

   Z (скор. від Zombie”) — зомбі-процес.

   %CPU — відсоток використовуваних ресурсів процесора.

   %MEM — відсоток використовуваної пам’яті.

   TIME+ — кількість процесорного часу, витраченого на виконання процесу.

   COMMAND — ім’я процесу (команди).

Також у поєднанні з основними символами стану процесу (S від STATUS”) ви можете зустріти і додаткові:

   < — процес з високим пріоритетом;

   N — процес з низьким пріоритетом;

   l — багатопотоковий процес;

   + — фоновий процес;

   s — лідер сесії.

Примітка: Усі процеси об’єднані у сесії. Процеси, що належать до однієї сесії, визначаються загальним ідентифікатором сесії — ідентифікатором процесу, який створив цю сесію. Лідер сесії — це процес, ідентифікатор сесії якого збігається з його ідентифікаторами процесу та групи процесів.

Команда glances

Команда glances — це відносно новий інструмент моніторингу системи з розширеним функціоналом:

$ glances

Примітка: Якщо у вашій системі відсутня дана утиліта, встановити її можна за допомогою наступних команд:

RHEL/CentOS/Fedora

$ yum install -y glances

Debian/Ubuntu/Linux Mint

$ sudo apt-get update
$ sudo apt-get install glances

Управління процесами в Linux

Також у Linux присутні деякі команди для управління процесами:

   kill — посилає процесу сигнал завершення роботи;

   pkill — завершує процес за його ім’ям;

   pgrep — шукає процес по його імені (і, опціонально, по імені користувача, що його запустив);

   killall — завершує всі активні процеси.

Нижче наведено декілька прикладів їх використання:

$ pgrep -u diego firefox
$ kill 6516
$ pgrep -u diego firefox
$ pgrep -u diego glances
$ pkill glances
$ pgrep -u diego glances

Відправка сигналів процесам

Основним способом управління процесами в Linux є надсилання їм відповідних сигналів. Щоб перелічити список усіх доступних сигналів, введіть команду:

$ kill -l

Щоб надіслати процесу потрібний сигнал, використовуйте команди kill, pkill або pgrep, про які ми згадували раніше. Але програми можуть реагувати на сигнали лише у тому випадку, якщо вони запрограмовані на розпізнавання цих сигналів.

Більшість сигналів призначені для внутрішнього використання системою або для програмістів, коли вони пишуть код. Нижче наведені найкорисніші сигнали:

   SIGHUP (1) — відправляється процесу, коли його керуючий термінал закрито.

   SIGINT (2) — відправляється процесу керуючим терміналом, коли користувач перериває процес натисканням клавіш Ctrl+C.

   SIGQUIT (3) — відправляється процесу, якщо користувач надсилає сигнал виходу Ctrl+D.

   SIGKILL (9) — цей сигнал негайно завершує (вбиває) процес, і процес не виконуватиме жодних операцій очищення за собою.

   SIGTERM (15) — сигнал завершення програми (відправляється командою kill за замовчуванням).

   SIGTSTP (20) — відправляється процесу керуючим терміналом із запитом на зупинку; ініціюється користувачем натисканням клавіш Ctrl+Z.

Нижче наведено приклади команди kill для знищення програми firefox за допомогою PID після його зависання:

$ pgrep -u diego firefox
2275 #відповідь термінала
$ kill 9 2275

або

$ kill -KILL 2275

або

$ kill -SIGKILL 2275

Щоб убити програму, використовуючи її ім’я, застосовуються команди pkill або killall, наприклад:

$ pkill firefox

або

$ killall firefox

Зміна пріоритету процеса

У системі Linux всі активні процеси мають певний пріоритет виконання, який задається так званим nice-значенням. Процеси з вищим пріоритетом зазвичай отримують більше процесорного часу, ніж процеси з нижчим пріоритетом. Однак користувач з root-правами може вплинути на це за допомогою команд nice та renice.

Дізнатися значення пріоритету команди можна по результату виконання команди top (стовпець NI):

$ top

Використовуйте команду nice, щоб задати NI-значення для процесу, що запускається. Майте на увазі, що звичайні користувачі можуть задавати даний параметр в діапазоні від 0 до 20 тим процесам, якими вони володіють. Тільки користувач root може використовувати від’ємні значення пріоритету.

Чим більше nice-значення, тим менший пріоритет матиме процес. Наприклад, ви можете задати пріоритет для процесу, що запускається, наступним чином:

$ nice -n 10 firefox

Щоб змінити пріоритет запущеного процесу, використовуйте команду renice наступним чином:

$ renice +8 5547
$ renice +8 1151

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *