Перейти до вмісту

Модуль 0.3: Путівник по процесах і ресурсах

Hands-On Lab Available
Ubuntu intermediate 35 min
Launch Lab ↗

Opens in Killercoda in a new tab

Щоденне використання | Складність: [QUICK] | Час: 40 хв

Перед початком цього модуля:


Що ви зможете робити після цього модуля

Розділ «Що ви зможете робити після цього модуля»

Після завершення цього модуля ви зможете:

  • Моніторити системні ресурси за допомогою top, htop, free, df та du
  • Визначити процеси, що споживають багато ресурсів, і вирішити, оптимізувати їх чи завершити
  • Пояснити load average, CPU steal та тиск на пам’ять у контексті здоров’я вузлів K8s
  • Діагностувати повільну систему, систематично перевіряючи CPU, пам’ять, диск та мережу

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

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

Ось чому:

  • Налагодження починається з процесів — Коли щось працює повільно або зламалося, перше питання завжди: «що зараз запущено і скільки ресурсів воно їсть?»
  • Сервери не лагодяться самі — Процес, що “збунтувався” і споживає 100% CPU о 3-й ночі, сам не зупиниться. Ви повинні знати, як його вбити.
  • Місце на диску зникає — Контейнери, логи та тимчасові файли заповнюють ваші диски. Вміння знаходити, що саме поглинає простір, рятує ваші продакшн-системи.
  • Kubernetes запускає процеси — Кожен контейнер — це процес. kubectl exec, завершення роботи пода, ліміти ресурсів — усе це базується на тому, що ви вивчите тут.

Думайте про це так: Модуль 0.1 навчив вас орієнтуватися в будинку. Цей модуль вчить перевіряти, хто вдома, чим вони займаються, і ввічливо (або силоміць) просити їх піти.


  • У вашій системі є сімейне дерево процесів — Кожен процес має батька. Найперший процес (PID 1) є предком усього іншого. Коли ви відкриваєте термінал і запускаєте ls, ваша оболонка є батьком, а ls — дитиною. Вбийте PID 1 — і вся система впаде. У Kubernetes ваш застосунок стає PID 1 всередині контейнера — саме тому обробка сигналів така важлива.

  • kill не завжди вбиває — Попри назву, команда kill насправді надсилає сигнали. Команда kill без опцій надсилає SIGTERM, що є ввічливим проханням: «будь ласка, заверши роботу». Процес може це повністю ігнорувати! Тільки kill -9 (SIGKILL) є справді фатальним, бо його обробляє ядро, а процес навіть не встигає його помітити.

  • Linux винайшов процеси-«зомбі» — Процес-зомбі — це той, що завершив роботу, але все ще висить у таблиці процесів, бо його батько не отримав його статус виходу. Зомбі не споживають ні CPU, ні пам’яті — це просто рядок у списку. Але якщо їх накопичаться тисячі, у вас закінчаться ідентифікатори процесів (PID) і нічого нового не зможе запуститися.

  • Директорія /proc — це вікно в кожен процес — Кожен запущений процес отримує папку за шляхом /proc/<PID>/, повну живої інформації. Хочете знати, яка саме команда запустила процес 1234? Прочитайте /proc/1234/cmdline. Хочете бачити його змінні оточення? /proc/1234/environ. Це не лог-файл — це ядро розповідає вам, що відбувається прямо зараз.


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

Кожен процес отримує:

  • PID (Process ID) — унікальний номер-ідентифікатор.
  • Батьківський PID (PPID) — номер процесу, який його запустив.
  • Ресурси — пам’ять, час процесора, відкриті файли.

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


Перегляд запущених процесів: ps

Розділ «Перегляд запущених процесів: ps»

Команда ps робить знімок (snapshot) запущених процесів — думайте про це як про фотографію, а не відео.

Базове використання

Розділ «Базове використання»
Terminal window
# Показати процеси у вашій поточній сесії термінала
ps

Вивід виглядає так:

PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:00 ps

Це лише ваша оболонка і сама команда ps. Не дуже цікаво. Щоб побачити все:

Всемогутня команда ps aux

Розділ «Всемогутня команда ps aux»
Terminal window
# Показати ВСІ процеси від УСІХ користувачів
ps aux
КолонкаЩо вона каже
USERХто володіє процесом
PIDНомер-ідентифікатор процесу
%CPUСкільки процесора він використовує прямо зараз
%MEMСкільки оперативної пам’яті він використовує
VSZВіртуальний розмір пам’яті (разом із бібліотеками — часто вводить в оману)
RSSResident Set Size — реальна фізична пам’ять, що використовується (те, що вас цікавить)
TTYДо якого термінала підключений (? означає фонову службу)
STATСтан процесу (див. нижче)
TIMEЗагальний час процесора, витрачений процесом
COMMANDКоманда, що запустила процес

Пошук конкретного процесу

Розділ «Пошук конкретного процесу»

Не гортайте сотні рядків. Фільтруйте:

Terminal window
# Знайти всі процеси, що мають "nginx" у назві
ps aux | grep nginx
# Краще: використовуйте pgrep (без зайвого шуму grep у результатах)
pgrep -a nginx

Ви побачите літери в колонці STAT:

КодЗначення
SSleeping (Спить) — чекає на щось (більшість процесів)
RRunning (Працює) — активно використовує процесор прямо зараз
TStopped (Зупинено) — поставлено на паузу
ZZombie (Зомбі) — завершено, але батько ще не “прибрав” за ним
DDisk sleep — чекає на ввід/вивід (I/O), неможливо перервати

Моніторинг у реальному часі: top та htop

Розділ «Моніторинг у реальному часі: top та htop»

Якщо ps — це фотографія, то top — це “панель приладів” наживо, що оновлюється кожні кілька секунд.

Terminal window
# Запустити top
top

Верхня секція дає огляд системи:

  • load average: Три числа (1-хв, 5-хв, 15-хв). Якщо вони вищі за кількість ядер вашого CPU, система перевантажена. На 4-ядерній машині load average 4.0 — це межа.
  • Tasks: Скільки всього процесів і в яких вони станах.
  • %Cpu: us — програми користувача, sy — ядро, id — бездіяльність (чим більше id, тим краще!), wa — очікування диска.

Корисні клавіші під час роботи top:

КлавішаДія
qВийти
MСортувати за пам’яттю
PСортувати за процесором (CPU)
kВбити процес (запитає PID)
1Показати навантаження на кожне ядро окремо

htop — це сучасна версія top з кольорами, підтримкою миші та набагато зручнішим інтерфейсом. Зазвичай його треба встановлювати окремо:

Terminal window
# Встановлення htop (Debian/Ubuntu)
sudo apt update && sudo apt install htop -y
# Запуск
htop

Чому htop кращий:

  • Кольорові індикатори CPU та RAM зверху.
  • Можна гортати список стрілками.
  • F5 — деревоподібний вигляд (хто кого запустив).
  • F9 — зручне надсилання сигналів.
  • / — швидкий пошук за назвою.

Зупинка процесів: Сигнали, kill та killall

Розділ «Зупинка процесів: Сигнали, kill та killall»

Іноді процес треба зупинити. Можливо, він завис, “з’їв” усю пам’ять або просто більше не потрібен. Тут допомагають сигнали.

Сигнали — це повідомлення, які операційна система надсилає процесу. Думайте про це як про поплескування по плечу (SIGTERM) проти силового витягування з кімнати (SIGKILL).

Два найважливіші сигнали:

СигналНомерЩо відбувається
SIGTERM15”Будь ласка, заверши роботу ввічливо”. Процес отримує сигнал і може прибрати за собою: зберегти файли, закрити з’єднання. Це правильний шлях.
SIGKILL9”Ти вбитий. Прямо зараз”. Ядро завершує процес миттєво. Жодного прибирання, жодних останніх слів. Використовуйте, тільки якщо SIGTERM не допоміг.

Попри назву, kill просто надсилає сигнал. За замовчуванням — SIGTERM:

Terminal window
# Надіслати SIGTERM (завжди пробуйте це першим)
kill 1234
# Надіслати SIGKILL (крайній захід)
kill -9 1234

Використання killall та pkill

Розділ «Використання killall та pkill»

Якщо ви знаєте назву програми, але не знаєте PID:

Terminal window
# Вбити всі процеси з назвою "nginx"
killall nginx
# Вбити за частиною назви
pkill sleep
# Вбити всі процеси конкретного користувача
pkill -u username

Золоте правило: Спочатку SIGTERM, потім SIGKILL

Розділ «Золоте правило: Спочатку SIGTERM, потім SIGKILL»

Завжди дотримуйтесь цього порядку:

  1. kill <PID> (SIGTERM) — зачекайте кілька секунд.
  2. kill -9 <PID> (SIGKILL) — тільки якщо процес усе ще живий.

У Kubernetes та сама логіка: при видаленні пода K8s надсилає SIGTERM, чекає 30 секунд (grace period) і тільки потім надсилає SIGKILL.


Фонова та передньопланова робота (Jobs)

Розділ «Фонова та передньопланова робота (Jobs)»

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

Запуск у фоні через &

Розділ «Запуск у фоні через &»

Додайте & в кінці будь-якої команди:

Terminal window
# Запустити sleep у фоні на 5 хвилин
sleep 300 &
# Вивід: [1] 12345 (номер завдання та PID)

Керування завданнями: jobs, fg, bg

Розділ «Керування завданнями: jobs, fg, bg»
Terminal window
# Список фонових завдань у поточному терміналі
jobs
# Ви запустили щось довге і забули про &, термінал заблоковано?
# Натисніть Ctrl+Z, щоб ПРИЗУПИНИТИ процес.
# Тепер запустіть його у ФОНІ (продовжити виконання)
bg
# Або поверніть фонове завдання на ПЕРЕДНІЙ ПЛАН
fg

Виживання при відключенні: nohup

Розділ «Виживання при відключенні: nohup»

Коли ви закриваєте термінал або SSH-сесію, всі запущені в ньому процеси зазвичай вмирають (отримують сигнал SIGHUP). nohup (no hangup) дозволяє процесу жити далі:

Terminal window
# Це виживе навіть після закриття SSH
nohup ./long-script.sh &

Використання диска: Куди зникло місце?

Розділ «Використання диска: Куди зникло місце?»

Коли диск переповнюється, сервіси починають падати. Вам потрібні два інструменти: df для загальної картини та du для пошуку винних.

df — Disk Free (Загальний вигляд)

Розділ «df — Disk Free (Загальний вигляд)»
Terminal window
# Показати вільне місце в зручному (M, G) форматі
df -h

Дивіться на колонку Use%. Якщо там понад 90% — час діяти.

du — Disk Usage (Детектив)

Розділ «du — Disk Usage (Детектив)»

df каже, який диск повний. du допомагає знайти конкретні папки:

Terminal window
# Знайти 10 найбільших папок у системі (ігноруємо помилки доступу)
du -sh /* 2>/dev/null | sort -rh | head -10

Тактика пошуку: починайте з кореня du -sh /*, знаходьте найбільшу папку (наприклад, /var), потім заходьте глибше: du -sh /var/* і так далі, поки не знайдете конкретний файл-винуватець (часто це старий гігантський лог).


ПомилкаЧому це поганоЩо робити замість цього
Використання kill -9 відразуПроцес не встигає зберегти дані або закрити з’єднанняСпочатку kill <PID>, чекайте 5 сек, потім -9
Ігнорування df до 100% заповненняБази даних можуть пошкодитися при спробі запису на повний дискПеревіряйте df -h регулярно або налаштуйте алерт на 80%
Випадкове натискання Ctrl+C на важливому довгому процесіПроцес вмирає і роботу треба починати з нуляВикористовуйте nohup або tmux для довгих завдань
Робота під root без потребиОдин невірний rm -rf / (наприклад, зайвий пробіл) знищить системуВикористовуйте sudo тільки для конкретних команд

  1. Яка різниця між ps та top?

    Відповідь `ps` — це статичний знімок (фотографія) на момент запуску команди. `top` — це динамічний дашборд, який оновлюється наживо.
  2. Ви ввели kill 5678, але процес не зникає. Що робити?

    Відповідь Надіслати жорсткий сигнал завершення: `kill -9 5678`. Цей сигнал обробляється ядром, і процес не може його проігнорувати.
  3. Як знайти, яка папка в /var займає найбільше місця?

    Відповідь `du -sh /var/* 2>/dev/null | sort -rh | head -5`. Це покаже 5 найбільших підпапок у `/var`.
  4. Що станеться, якщо натиснути Ctrl+Z під час роботи команди?

    Відповідь Команда не завершиться, а стане на паузу (Stopped). Її можна буде продовжити в фоні командою `bg` або повернути на передній план через `fg`.

Практична вправа: Полювання на процеси

Розділ «Практична вправа: Полювання на процеси»

Завдання: Навчіться керувати життєвим циклом програми та моніторити ресурси.

  1. Запустіть “нескінченну” програму в фоні:
    Terminal window
    sleep 1000 &
  2. Знайдіть її PID за допомогою ps та grep:
    Terminal window
    ps aux | grep sleep
  3. Подивіться на неї в top (натисніть q для виходу):
    Terminal window
    top
  4. Вбийте цей процес ввічливо:
    Terminal window
    kill <ваш_PID>
  5. Перевірте вільне місце на дисках:
    Terminal window
    df -h
  6. Знайдіть 3 найбільші папки у вашому домашньому каталозі:
    Terminal window
    du -sh ~/* 2>/dev/null | sort -rh | head -3

Критерії успіху: Ви вмієте запускати процеси у фоні, знаходити їх за назвою та безпечно зупиняти.


Ви вже вмієте вбивати процеси й знаходити зникле місце на диску. Але хто керує сервісами, які запускаються самі при старті системи — вашими вебсерверами чи базами даних? Час дізнатися про систему, що оркеструє все.

Далі: Модуль 0.4: Сервіси та логи без таємниць