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

Модуль 6.3: Відлагодження процесів

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

Opens in Killercoda in a new tab

Вирішення проблем | Складність: [COMPLEX] | Час: 30–35 хв

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


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

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

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

  • Діагностувати зависання процесів, падіння та витоки ресурсів за допомогою strace, lsof та /proc
  • Відстежити системні виклики, щоб зрозуміти, що процес насправді робить
  • Визначити витоки файлових дескрипторів, зомбі-процеси та застряглі операції I/O
  • Дебажити процеси контейнерів, входячи в їхній простір імен за допомогою nsenter

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

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

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

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

  • Розбирати «чорні скриньки» — розуміти роботу програм без доступу до їхнього коду.
  • Знаходити причини зависань — чому цей процес нічого не робить?
  • Відстежувати помилки — який саме виклик завершився збоєм і чому?
  • Аналізувати поведінку — що насправді відбувається під час виконання?

Іноді єдиний спосіб зрозуміти проблему — це подивитися на процес у дії.


Файлова система /proc

Розділ «Файлова система /proc»

Кожен запущений процес має свою віртуальну папку в /proc/<PID>/. Це вікно у внутрішній світ процесу.

Важливі файли в /proc:

Розділ «Важливі файли в /proc:»
  • cmdline — команда, якою було запущено процес.
  • cwd — посилання на поточну робочу директорію.
  • environ — змінні оточення процесу.
  • exe — посилання на файл програми на диску.
  • fd/ — папка з усіма відкритими файлами (file descriptors).
  • limits — ліміти ресурсів (макс. кількість файлів тощо).
  • status — статус процесу в зрозумілому для людини виді.
Terminal window
# Порахувати кількість відкритих файлів для процесу
ls /proc/1234/fd/ | wc -l

strace: Перехоплення системних викликів

Розділ «strace: Перехоплення системних викликів»

strace — це найпотужніший інструмент для дебагу. Він показує кожен системний виклик, який програма робить до ядра.

Terminal window
# Відстежити виконання команди з нуля
strace ls /tmp
# Підключитися до вже запущеного процесу
strace -p 1234
# Тільки виклики, пов'язані з мережею
strace -e trace=network curl google.com
# Тільки виклики, пов'язані з файлами
strace -e trace=file cat /etc/passwd
# Підрахувати кількість викликів та час (статистика)
strace -c -p 1234

Стани процесів (Process States)

Розділ «Стани процесів (Process States)»

Ви побачите літери у колонці STAT команди ps aux.

┌─────────────────────────────────────────────────────────────┐
│ СТАНИ ПРОЦЕСІВ │
├─────────────────────────────────────────────────────────────┤
│ │
│ R - Running (працює або чекає на CPU) │
│ S - Sleeping (спить, чекає на подію — це нормально) │
│ D - Uninterruptible sleep (чекає на ввід/вивід — погано!) │
│ Z - Zombie (завершений, але не прибраний батьком) │
│ T - Stopped (зупинений сигналом) │
│ │
└─────────────────────────────────────────────────────────────┘

Стан D є найнебезпечнішим. Якщо ви бачите процес у стані D — він завис на операції з диском або мережевим сховищем (NFS). Такий процес неможливо вбити навіть через kill -9.


lsof: Список відкритих файлів

Розділ «lsof: Список відкритих файлів»

В Linux “усе є файлом”, тому lsof показує і звичайні файли, і мережеві з’єднання.

Terminal window
# Всі файли, відкриті конкретним процесом
lsof -p 1234
# Хто зараз використовує 80-й порт?
sudo lsof -i :80
# Всі мережеві з'єднання в системі
lsof -i

  1. Яка команда Linux показує всі системні виклики, які робить програма?

    Відповідь `strace`.
  2. Що означає стан ‘Z’ (Zombie) у списку процесів?

    Відповідь Процес завершив свою роботу, але його батьківський процес ще не прочитав його статус виходу. Зомбі не споживають ресурсів, але займають місце в таблиці PID.
  3. Як за допомогою lsof знайти процес, що займає конкретний мережевий порт?

    Відповідь `lsof -i :<номер_порту>`. Наприклад: `lsof -i :8080`.
  4. Процес знаходиться у стані ‘D’ і не реагує на kill -9. Чому?

    Відповідь Стан 'D' (Uninterruptible sleep) означає, що процес чекає на відповідь від ядра (зазвичай ввід/вивід на диск). В такому стані він не може обробляти сигнали, поки ядро не завершить операцію.

Завдання: Навчитися бачити дії програми “під капотом”.

  1. Подивіться, які конфіги читає команда id:
    Terminal window
    strace -e openat id
  2. Знайдіть всі відкриті файли вашої поточної оболонки:
    Terminal window
    lsof -p $$
  3. Подивіться на ліміти ресурсів вашого процесу:
    Terminal window
    cat /proc/$$/limits
  4. Підрахуйте статистику системних викликів для команди find /etc:
    Terminal window
    strace -c find /etc

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


  • /proc — база даних про всі процеси в реальному часі.
  • strace — перехоплення спілкування програми з ядром.
  • lsof — пошук власників відкритих файлів та портів.
  • Стан D — головна ознака проблем із дисками або мережевими дисками.

Далі: Модуль 6.4: Відлагодження мереж — навчіться розв’язувати проблеми зі зв’язком за допомогою tcpdump.