Як використовувати команду ps для моніторингу процесів Linux

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

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

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

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

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

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

Перегляд списку процесів

Найпростіший спосіб використання `ps` – запустити її без аргументів:

ps

Команда `ps` показує список процесів, запущених користувачем, який її виконує.

Вивід складається з чотирьох стовпців:

  • PID: Ідентифікаційний номер процесу.
  • TTY: Назва терміналу, з якого запущено процес.
  • TIME: Сумарний час обробки процесора, використаний процесом.
  • CMD: Назва команди, що запустила процес.

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

Використовуючи опцію `-e` (вибрати всі процеси), `ps` виведе процеси, запущені усіма користувачами, а не лише тим, хто виконує команду. Оскільки список буде досить довгим, скористаємося `less` для його перегляду.

ps -e | less

Вивід команди передається в `less`.

Список процесів став довшим, але стовпці залишилися тими самими. Записи зі знаком питання `?` в стовпці TTY не були запущені з терміналу.

Відображення ієрархії процесів

Іноді корисно побачити, які процеси запустили інші процеси. Це може допомогти виявити проблему або ідентифікувати певний процес. Для цього використовується опція `-H` (ієрархія).

ps -eH | less

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

Для наочності можна використати опцію `–forest`, яка покаже ієрархію процесів у вигляді дерева з використанням символів ASCII.

ps -eH --forest | less

Таке представлення полегшує відстеження ієрархічних зв’язків між процесами.

Пошук процесів за назвою

Можна використовувати `grep` для пошуку процесів за назвою. Наприклад, для пошуку процесів, що містять “firefox” у назві, використовуємо:

ps -e | grep firefox

Вивід показує один процес, що відповідає критеріям пошуку. Якщо б було запущено кілька екземплярів Firefox, у списку було б кілька рядків.

Відображення додаткової інформації про процеси

Для отримання додаткової інформації про процеси використовуйте опцію `-f` (повний формат).

ps -ef | less

З’явилися додаткові стовпці з інформацією.

Нові стовпці:

  • UID: Ідентифікатор користувача, що є власником процесу.
  • PID: Ідентифікатор процесу.
  • PPID: Ідентифікатор батьківського процесу.
  • C: Кількість дочірніх процесів.
  • STIME: Час початку процесу.
  • TTY: Назва терміналу, з якого запущено процес.
  • TIME: Загальний час, витрачений процесом на обробку процесором.
  • CMD: Назва команди, що запустила процес.

Опція `-F` (дуже повний формат) надає ще більше стовпців:

ps -eF | less

Для перегляду всіх стовпців потрібно прокрутити екран вбік.

Натискання клавіші «Стрілка вправо» прокрутить вивід вліво.

Тепер список стовпців виглядає так:

  • UID: Ідентифікатор користувача, що є власником процесу.
  • PID: Ідентифікатор процесу.
  • PPID: Ідентифікатор батьківського процесу.
  • C: Кількість дочірніх процесів.
  • SZ: Розмір образу процесу в сторінках RAM.
  • RSS: Розмір резидентного набору (не свопірувана фізична пам’ять, що використовується процесом).
  • PSR: Процесор, якому призначено процес.
  • STIME: Час початку процесу.
  • TTY: Назва терміналу, з якого запущено процес.
  • TIME: Загальний час, витрачений процесом на обробку процесором.
  • CMD: Назва команди, що запустила процес.

Перелік процесів за ідентифікатором

Маючи ідентифікатор процесу, ви можете отримати детальну інформацію саме про цей процес за допомогою опції `-p`.

ps -p 3403

Виводиться інформація про процес з ID 3403.

Можна перерахувати процеси, розділяючи їх ID пробілами.

Перегляд процесів за назвою команди

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

ps -C shutter

Виводиться інформація про процес `shutter`.

Показ процесів, що належать певному користувачу

Для перегляду процесів, що належать певному користувачу, використовуйте опцію `-u` (список користувачів):

ps -u mary

Показані процеси, що належать користувачу `mary`.

Виведення процесів за терміналом

Для перегляду процесів, пов’язаних з певним терміналом, використовуйте опцію `-t` (вибір TTY). Якщо `-t` використовується без номера TTY, будуть показані процеси, пов’язані з поточним вікном терміналу.

tty
ps -t

Команда `tty` показує, що це псевдотермінал `0`. Процеси, виведені `ps -t`, пов’язані з `pts/0`.

Якщо передати номер TTY в командному рядку, виведеться звіт про процеси, пов’язані з цим TTY.

ps -t 1

Цього разу, всі процеси пов’язані з `TTY pts/1`.

Вибір стовпців для відображення

З опцією `-o` (формат) ви можете вибрати, які стовпці будуть виведені командою `ps`. Стовпці вказуються за назвою. Список доступних назв стовпців можна знайти на сторінці man. Наприклад, щоб вивести час CPU (pcpu) та командний рядок з аргументами (args), використаємо:

ps -e -o pcpu,args | less

Вивід містить тільки вказані стовпці.

Сортування результату за стовпцями

Вивід можна сортувати за допомогою опції `–sort`. Наприклад, щоб відсортувати вивід за стовпцем CPU:

ps -e -o pcpu,args --sort -pcpu| less

Дефіс “-” перед `pcpu` вказує, що сортування буде в порядку спадання.

Щоб побачити 10 процесів, що використовують найбільше CPU, передамо вивід через команду `head`:

ps -e -o pcpu,args --sort -pcpu | head -10

Отримано відсортований список перших 10 процесів.

Можна сортувати за кількома стовпцями. Додамо стовпець `pmem` (відсоток пам’яті, що використовується процесом). Без дефіса або з плюсом `+` порядок сортування буде зростаючим.

ps -e -o pcpu,pmem,args --sort -pcpu,pmem | head -10

Отримали додатковий стовпець, і сортування відбувається спочатку за `pcpu` (спадання), а потім за `pmem` (зростання).

Для більшої зручності, додамо стовпець ідентифікатора процесу (pid), щоб було видно номер кожного процесу:

ps -e -o pid,pcpu,pmem,args --sort -pcpu,pmem | head -10

Тепер можна ідентифікувати процеси.

Завершення процесів за ідентифікатором

Після того, як процес ідентифіковано, його можна завершити за допомогою команди `kill`, використовуючи його ID. Наприклад, щоб завершити процес з ID 898, використовуйте:

sudo kill 898

Якщо все пройшло успішно, процес буде завершено без повідомлень.

Завершення процесів за назвою

Команда `pkill` дозволяє завершувати процеси за їх назвою. Обов’язково перевірте, що ви ідентифікували саме потрібний процес! Наприклад, для завершення процесу `top`:

sudo pkill top

Знову ж таки, відсутність повідомлення означає успішне завершення.

Завершення декількох процесів за назвою

Якщо запущено кілька копій процесу або процес породив декілька дочірніх процесів (наприклад, Google Chrome), ви можете їх завершити командою `killall`.

Припустимо, у нас запущено два екземпляри `top`:

ps -e | grep top

Команда `killall` завершить обидва процеси:

sudo killall top

Відсутність повідомлення означає, що обидва процеси завершено.

Динамічний перегляд процесів з `top`

Команда `ps` надає статичний знімок стану. Для динамічного перегляду використовуйте `top`. Він показує оновлюваний список процесів у вашій системі. Екран складається з панелі інструментів у верхній частині та таблиці процесів внизу.

Запустимо `top`:

top

Стовпці таблиці містять наступну інформацію:

  • PID: Ідентифікатор процесу.
  • USER: Ім’я власника процесу.
  • PR: Пріоритет процесу.
  • NI: Значення nice процесу.
  • VIRT: Об’єм віртуальної пам’яті, що використовується процесом.
  • RES: Об’єм резидентної пам’яті, що використовується процесом.
  • SHR: Об’єм спільної пам’яті, що використовується процесом.
  • S: Стан процесу.
  • %CPU: Відсоток часу CPU, що використовується процесом з моменту останнього оновлення.
  • %MEM: Відсоток фізичної пам’яті, що використовується процесом.
  • TIME+: Загальний час CPU, витрачений процесом у сотих частках секунди.
  • COMMAND: Назва команди або командний рядок. Якщо стовпець COMMAND не видно, натисніть “Стрілка вправо”.

Можливі стани процесу:

  • D: Безперервний сон.
  • R: Виконується.
  • S: Спить.
  • T: Відстежено (зупинено).
  • Z: Зомбі.

Натисніть клавішу `Q`, щоб вийти з `top`.

Перед завершенням процесу

Переконайтеся, що ви знайшли саме потрібний процес, і що його завершення не призведе до проблем. Зокрема, варто перевірити ієрархію процесів за допомогою опцій `-H` та `–forest`, щоб переконатися, що немає важливих дочірніх процесів, про які ви забули.