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

Лабораторна робота 8: Моніторинг системи та процесів

Завдання

Після виконання цієї лабораторної роботи ви зможете:

  • переглядати та керувати процесами
  • вбити помилкові процеси
  • змінити пріоритет процесу

Приблизний час виконання цієї лабораторної роботи: 60 хвилин

Вступ

Ці вправи охоплюють різні теми, пов’язані з моніторингом та керуванням процесами в системах Linux. Розглянуті теми включають ідентифікацію та контроль процесів, керування пріоритетами процесів, обробку сигналів, моніторинг ресурсів та керування «cgroups».

Завдання 1

ps і /proc дослідження

Щоб дослідити та ідентифікувати перший системний процес

  1. Увійдіть в систему під будь-яким користувачем.

  2. Знайдіть назву процесу з ідентифікатором процесу 1 за допомогою /proc.

cat /proc/1/comm

!!! question "Питання"

 Як називається процес з PID 1?
  1. Перегляньте ім’я та шлях до виконуваного файлу процесу з PID 1.
ls -l /proc/1/exe

!!! question "Питання"

 Який шлях до виконуваного файлу за PID 1?
  1. Використовуйте команду ps, щоб дізнатися назву процесу або програми, що стоїть за PID 1.
ps -p 1 -o comm=

!!! question "Питання"

 Чи підтверджує команда `ps` назву процесу?
  1. Використовуйте команду ps, щоб переглянути повний шлях і будь-які аргументи командного рядка процесу або програми за PID 1.
ps -p 1 -o args=

!!! question "Питання"

 Який повний шлях і аргументи командного рядка для процесу з PID 1?

!!! question "Питання"

 Чому процес із PID 1 важливий у системі Linux?

Щоб відобразити детальну інформацію про процес за допомогою ps

Наступні кроки показують, як використовувати ps для відображення основної інформації про процес.

  1. Використовуйте команду ps, щоб відобразити список усіх процесів у структурі дерева.
ps auxf

!!! question "Питання"

 Яка структура списку процесів і яка інформація відображається?
  1. Відфільтруйте список лише для відображення процесів, пов’язаних із певним користувачем, наприклад, користувачем «root».
ps -U root

Переконайтеся, що відображаються лише процеси для користувача root.

  1. Показуйте процеси в детальному форматі, включаючи дерево процесів і потоки. Впишіть:
ps -eH

!!! question "Питання"

 Які додаткові деталі відображаються в цьому форматі?
  1. Відображати процеси, відсортовані за використанням ЦП у порядку спадання.
ps aux --sort=-%cpu

!!! question "Питання"

 Який процес споживає найбільше ЦП?

Завдання 2

Керування процесами за допомогою kill

Щоб завершити процес за допомогою kill

  1. Запустіть тривалий процес сну у фоновому режимі та відобразіть PID на своєму терміналі. Впишіть:
(sleep 3600 & MYPROC1=$! && echo PID is: $MYPROC1) 2>/dev/null

Вихід

PID is: 1331933

Занотуйте PID для нового процесу у вашій системі. PID також зберігається в змінній $MYPROC1.

  1. Надішліть сигнал завершення (SIGTERM) процесу «сплячого режиму».
kill $MYPROC1

Замініть $MYPROC1 фактичним PID з кроку 1.

  1. Перевірте, чи було завершено процес за допомогою ps і ps aux.
ps aux | grep -v grep | grep sleep

Для завершення процесів за допомогою сигналів kill

  1. Почніть новий процес сну та запишіть його PID. Впишіть:
(sleep 3600 & MYPROC2=$! && echo PID is: $MYPROC2) 2>/dev/null

Вихід

PID is: 1333258
  1. Надішліть інший сигнал (наприклад, SIGHUP) до нового процесу сну. Впишіть:
kill -1 $MYPROC2

Переконайтеся, що $MYPROC2 більше не міститься в таблиці процесів.

  1. Почніть новий процес ping і запишіть його PID. Впишіть:
{ ping localhost > /dev/null 2>&1 & MYPROC3=$!; } \
    2>/dev/null; echo "PID is: $MYPROC3"
  1. Використовуйте команду kill, щоб надіслати сигнал SIGTERM процесу ping. Впишіть:
kill -15 $MYPROC3

Замініть MYPROC3 фактичним PID процесу у вашій системі.

  1. Запустіть тривалий процес за допомогою команди cat. Впишіть:
{ cat /dev/random > /dev/null 2>&1 & MYPROC4=$!; } \
 2>/dev/null; echo PID is: $MYPROC4

Занотуйте PID для процесу у вашій системі.

  1. Використовуйте kill, щоб примусово завершити процес, надіславши сигнал SIGKILL.
kill -9 $MYPROC4

Підтвердьте, що процес завершено.

!!! question "Питання"

 Поясніть мету надсилання сигналів процесам за допомогою команди `kill` і значення різних типів сигналів.

Завдання 3

Моніторинг системних ресурсів за допомогою top

Для моніторингу використання системних ресурсів за допомогою top

  1. Запустіть верхню команду, щоб переглянути системну статистику в реальному часі.
top

!!! question "Питання"

 Яка інформація відображається у верхньому інтерфейсі?
  1. Спостерігайте за використанням процесора та пам’яті процесами у верхньому інтерфейсі.

!!! question "Питання"

 Які процеси споживають найбільше процесора та пам’яті?
  1. Відсортуйте процеси вгорі за використанням ЦП (натисніть P) і використанням пам’яті (натисніть M).

!!! question "Питання"

 Які процеси найбільше споживають процесор і пам’ять після сортування?

Щоб контролювати використання процесора та пам’яті певними процесами, використовуючи top

  1. Створіть довільно великий файл розміром 512 МБ, який містить випадкові дані.
sudo fallocate -l 512M  ~/large-file.data
  1. Почніть ресурсомісткий процес, наприклад значне стиснення файлу.
 tar -czf archive.tar.gz /path/to/large/directory
  1. Відкрийте команду top, щоб контролювати використання ЦП і пам'яті.
 top
  1. У верхньому інтерфейсі знайдіть і виберіть ресурсомісткий процес.

!!! question "Питання"

 Який ідентифікатор процесу та використання ресурсів інтенсивного процесу?
  1. Змініть порядок сортування вгорі, щоб відобразити процеси, які використовують найбільше ЦП або пам’яті (натисніть P або M).

!!! question "Питання"

 Який процес знаходиться у верхній частині списку після сортування?
  1. Вийдіть із верхньої частини, натиснувши q.

Для моніторингу процесів і використання ресурсів за допомогою top

  1. Запустіть команду top в інтерактивному режимі.
top

!!! question "Питання"

 Яка інформація відображається на верхньому екрані?
  1. Використовуйте одну клавішу, щоб відобразити підсумок використання окремого ядра ЦП.

!!! question "Питання"

 Яка розбивка використання ядра ЦП для кожного ядра?
  1. Натисніть u, щоб відобразити процеси для певного користувача. Введіть своє ім'я користувача.

!!! question "Питання"

 Які процеси зараз запущені для вашого користувача?
  1. Відсортуйте процеси за використанням пам’яті (натисніть M) і спостерігайте за процесами, які споживають найбільше пам’яті.

!!! question "Питання"

 Які процеси використовують найбільше пам’яті?
  1. Вийдіть із верхньої частини, натиснувши q.

!!! question "Питання"

 Поясніть значення моніторингу системних ресурсів за допомогою команди top і як це може допомогти у вирішенні проблем продуктивності.

Завдання 4

Зміна пріоритету процесу за допомогою nice і renice

Щоб налаштувати пріоритет процесу за допомогою nice

  1. Запустіть процес із інтенсивним використанням процесора, який виконується з пріоритетом за замовчуванням/звичайним. Впишіть:
bash -c  'while true; do echo "Default priority: The PID is $$"; done'

Вихід

Default priority: The PID is 2185209
Default priority: The PID is 2185209
Default priority: The PID is 2185209
....<SNIP>...

З виведених даних значення PID у нашій системі зразка становить «2185209».

Значення PID у вашій системі буде іншим.

Зверніть увагу на те, що значення PID постійно відображається на екрані вашої системи.

  1. В іншому терміналі, використовуючи значення PID, перевірте пріоритет процесу за замовчуванням за допомогою ps. Впишіть:
ps -p <PID> -o ni

!!! question "Питання"

 Який пріоритет процесу за замовчуванням (значення `nice`) запущеного процесу?
  1. Використовуючи надрукований PID процесу, завершіть процес за допомогою команди kill.

  2. Використовуючи команду nice, перезапустіть подібний процес із нижчим значенням якості (тобто більш сприятливим для процесу АБО вищим пріоритетом). Використовуйте nice значення «-20». Впишіть:

nice -n -20 bash -c  'while true; do echo "High priority: The PID is $$"; done'
  1. Використовуючи ваше значення PID, перевірте пріоритет процесу за допомогою ps. Впишіть:
ps -p <PID> -o ni

!!! question "Питання"

 Чи успішно встановлено пріоритет процесу?
  1. Одночасно натисніть клавіші Ctrl+C на клавіатурі, щоб «закрити» новий процес з високим пріоритетом.

  2. Знову використовуючи команду nice, перезапустіть інший процес, але цього разу з вищим значенням акуратності (тобто найменш сприятливим для процесу АБО нижчим пріоритетом). Використовуйте nice значення 19, впишіть:

 nice -n 19 bash -c  'while true; do echo "Low priority: The PID is $$"; done'

Вихід

Low priority: The PID is 2180254
Low priority: The PID is 2180254
...<SNIP>...
  1. Перевірте настроюваний пріоритет процесу за допомогою ps. Впишіть:
ps -p <PID> -o ni
  1. Одночасно натисніть клавіші Ctrl+C на клавіатурі, щоб припинити новий процес із низьким пріоритетом.

  2. Поекспериментуйте зі зміною пріоритету різних процесів на вищі та нижчі значення та спостерігайте за впливом на використання ресурсів процесу.

Щоб налаштувати пріоритет запущеного процесу за допомогою renice

  1. Розпочніть інтенсивний процес, наприклад тривалий математичний розрахунок за допомогою утиліти md5sum. Впишіть:
find / -path '/proc/*' -prune -o -type f -exec md5sum {} \; > /dev/null
  1. Використовуйте команду ps, щоб визначити PID попереднього процесу find/md5sum. Впишіть:
ps -C find -o pid=

Вихід

2577072

Вихідні дані показують, що значення PID у нашій системі зразка становить «2577072».

Значення PID у вашій системі буде іншим.

Занотуйте значення PID у вашій системі.

  1. Використовуйте команду renice, щоб змінити пріоритет запущеного процесу find/md5sum на нижче значення точності (наприклад, -10, вищий пріоритет). Впишіть:
renice  -n -10 -p $(ps -C find -o pid=)

Вихід

<PID> (process ID) old priority 0, new priority -10

Замініть "" (вище) фактичним PID запущеного процесу.

  1. Контролюйте використання ресурсів для процесу find/md5sum за допомогою top (або htop). Впишіть:
top -cp $(ps -C find -o pid=)

!!! question "Питання"

 Чи отримує процес тепер більшу частку ресурсів ЦП?
  1. Змініть пріоритет процесу find/md5sum на вище значення nice (наприклад, 10, нижчий пріоритет). Впишіть:
renice  -n 10 -p <PID>

Вихід

2338530 (process ID) old priority -10, new priority 10

Замініть "" (вище) фактичним PID запущеного процесу.

!!! question "Питання"

 Поясніть, як команда `nice` використовується для налаштування пріоритетів процесів і як вона впливає на розподіл системних ресурсів.
  1. Одночасно натисніть клавіші Ctrl+C на клавіатурі, щоб зупинити процес find/md5sum. Ви також можете використати команду kill, щоб виконати те ж саме.

Завдання 5

Ідентифікація процесів за допомогою pgrep

Ідентифікація процесів за допомогою pgrep

  1. Використовуйте команду pgrep, щоб визначити всі процеси, пов’язані з певною програмою чи службою, наприклад sshd.
pgrep sshd

!!! question "Питання"

 Які ідентифікатори процесів `sshd`?
  1. Перевірте існування ідентифікованих процесів за допомогою команди ps.
 ps -p <PID1,PID2,...>

Замініть "\" ідентифікаторами процесу, отриманими на кроці 1.

  1. Використовуйте команду pgrep, щоб ідентифікувати процеси з певною назвою, наприклад, "cron".
pgrep cron

!!! question "Питання"

 Чи існують процеси з назвою "cron"?

!!! question "Питання"

 Поясніть різницю між використанням `ps` і `pgrep` для ідентифікації та керування процесами.

Завдання 6

Основні та фонові процеси

Ця вправа охоплює керування процесами за допомогою fg і bg

Для керування фоновими та активними процесами за допомогою bg і fg

  1. Почніть довготривалий процес на передньому плані. Наприклад, ви можете використати просту команду на зразок sleep. Впишіть:
sleep 300
  1. Призупиніть процес переднього плану, натиснувши Ctrl+Z на клавіатурі. Це повинно повернути вас до командної оболонки.

  2. Виведіть список призупинених завдань за допомогою команди jobs. Впишіть:

jobs

!!! question "Питання"

 Який статус призупиненої роботи?
  1. Поверніть призупинене завдання на передній план за допомогою команди fg.
fg

!!! question "Питання"

 Що відбувається, коли ви повертаєте роботу на перший план?
  1. Знову призупиніть роботу за допомогою Ctrl+Z, а потім перемістіть її у фоновий режим за допомогою команди bg.
bg

!!! question "Питання"

 Який зараз статус роботи?

!!! question "Питання"

 Поясніть призначення активних і фонових процесів і як ними керують за допомогою команд `fg` і `bg`.

Щоб розпочати процес у фоновому режимі

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

Призупиніть запущений процес за допомогою Ctrl+Z.

  1. Список статусів усіх активних завдань. Впишіть:
jobs -l

!!! question "Питання"

 Який статус процесу `sleep 300`?
  1. Поверніть фоновий процес на передній план за допомогою команди fg.
fg
  1. Передчасно завершити процес «сплячого режиму», надіславши йому сигнал SIGSTOP, натиснувши Ctrl+C.

Для керування інтерактивними процесами за допомогою bg і fg

  1. Запустіть інтерактивний процес, наприклад текстовий редактор vi, щоб створити та відредагувати зразок текстового файлу під назвою "foobar.txt". Впишіть:
vi foobar1.txt

Призупиніть запущений процес за допомогою Ctrl + Z.

Використовуйте команду bg, щоб перевести призупинений процес у фоновий режим.

bg

!!! question "Питання"

 Процес зараз працює у фоновому режимі?
  1. Введіть «Hello» у foobar1.txt у вашому редакторі vi.

  2. Призупиніть запущений сеанс редагування тексту vi, натиснувши Ctrl+Z.

  3. Запустіть ще один окремий сеанс редактора vi, щоб створити інший текстовий файл під назвою "foobar2.txt". Впишіть:

vi foobar2.txt
  1. Введіть зразок тексту «Hi inside foobar2.txt» під час 2-го сеансу vi.

  2. Призупиніть 2-й сеанс vi за допомогою Ctrl+Z.

  3. Покажіть статус усіх «задач» на поточному терміналі. Впишіть:

jobs -l

Вихід

[1]- 2977364 Stopped       vi foobar1.txt
[2]+ 2977612 Stopped       vi foobar2.txt

Ви повинні мати принаймні дві роботи, перелічені у вашому виході. Число в 1-му стовпчику вихідних даних показує номери робіт - [1] і [2].

  1. Відновіть та виведіть на передній план 1-й сеанс vi, ввівши:
fg %1
  1. Знову призупиніть перший сеанс vi за допомогою Ctrl+Z.

  2. Відновіть та виведіть на передній план 2-й сеанс vi, ввівши:

    fg %2
    
  3. Припиніть обидва сеанси редагування vi, надіславши сигнал KILL до обох завдань. Слідкуйте за командою kill з командою jobs. Впишіть:

     kill -SIGKILL  %1 %2 && jobs
    

    Вихід

    [1]-  Killed                  vi foobar1.txt
    [2]+  Killed                  vi foobar2.txt
    

Завдання 7

Ідентифікація процесу за допомогою pidof

Щоб знайти ідентифікатор процесу запущеної команди за допомогою pidof

  1. Давайте виберемо зразок/поширений запущений процес, ідентифікатор процесу якого ми хочемо знайти. Ми будемо використовувати systemd як наш приклад.

  2. Використовуйте команду pidof, щоб знайти ідентифікатор процесу systemd. Впишіть:

pidof systemd

Зверніть увагу на ідентифікатор(и) процесу systemd.

  1. Перевірте існування ідентифікованого процесу за допомогою команди ps.
ps -p <PID>

Замініть фактичним ідентифікатором процесу, отриманим на кроці 2.

!!! question "Питання"

 Поясніть різницю між `pgrep` і `pidof` для пошуку ідентифікатора процесу запущеної команди.

Завдання 8

Вивчення файлової системи /sys

Щоб дослідити файлову систему /sys

  1. Виведіть вміст каталогу /sys. Впишіть:
ls /sys

!!! question "Питання"

 Яка інформація зберігається в каталозі /sys?
  1. Перейдіть до певного запису /sys, наприклад, інформації про ЦП.
cd /sys/devices/system/cpu
  1. Виведіть список вмісту поточного каталогу, щоб переглянути інформацію, пов’язану з ЦП.
ls

!!! question "Питання"

 Яка інформація про ЦП доступна у файловій системі /sys?

!!! question "Питання"

 Поясніть призначення файлової системи /sys в Linux і її роль в управлінні обладнанням і конфігурацією системи.

Завдання 9

Знищення процесів за назвою за допомогою pkill

Щоб завершити процеси за назвою за допомогою pkill

  1. Ідентифікуйте процеси з конкретною назвою, наприклад "firefox".
pkill firefox

!!! question "Питання"

 Чи всі процеси з назвою "firefox" були припинені?
  1. Перевірте стан процесів, які ви зупинили за допомогою ps.
 ps aux | grep firefox

!!! question "Питання"

 Чи залишилися процеси з назвою "firefox"?

Використовуйте pkill, щоб примусово припинити всі процеси з певним іменем.

pkill -9 firefox

Переконайтеся, що всі процеси з назвою «firefox» завершено.

!!! question "Питання"

 Яка різниця між використанням `kill` і `pkill` для завершення процесів за назвою?

Вправа 10

Ця вправа охоплює використання потужної команди exec.

Керування процесом за допомогою exec

Щоб замінити поточну оболонку іншою командою за допомогою exec

  1. Розпочніть новий сеанс оболонки. Впишіть:
bash
  1. Виконайте команду, яка не завершується в новій оболонці, наприклад простий цикл while.
 while true; do echo "Running..."; done
  1. У поточній оболонці замініть запущену команду на іншу за допомогою exec.
 exec echo "This replaces the previous command."

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

  1. Переконайтеся, що стара команда більше не виконується за допомогою ps.
ps aux | grep "while true"

!!! question "Питання"

 Попередня команда все ще виконується?

!!! question "Питання"

 Поясніть, як команда `exec` може замінити поточний процес оболонки на іншу команду.

Вправа 11

Керування процесом за допомогою killall

Як і kill, killall є командою для завершення процесів за назвою. Можна спостерігати певну подібність між використанням killall , kill і pkill у завершенні процесу.

Щоб завершити процеси за назвою за допомогою killall

  1. Ідентифікуйте процеси за допомогою конкретної назви, наприклад «chrome».
 killall chrome

!!! question "Питання"

 Чи всі процеси з назвою "chrome" були припинені?
  1. Перевірте стан процесів, які ви зупинили за допомогою ps.
 ps aux | grep chrome

!!! question "Питання"

 Чи залишилися процеси з назвою "chrome"?
  1. Використовуйте killall, щоб примусово припинити всі процеси з певною назвою.
 killall -9 chrome

Переконайтеся, що всі процеси з іменем "chrome" завершено.

!!! question "Питання"

 Чим `killall` відрізняється від `pkill` і `kill` при завершенні процесів за назвою?

Вправа 12

Керування cgroups

Для керування процесами за допомогою cgroups

  1. Перелічіть існуючі cgroups у вашій системі.
cat /proc/cgroups

!!! question "Питання"

 Які контролери `cgroup` доступні у вашій системі?
  1. Створіть нову cgroup за допомогою контролера ЦП. Назвіть її «mygroup».
sudo mkdir -p /sys/fs/cgroup/cpu/mygroup
  1. Перемістіть певний процес (наприклад, запущену команду сну) до «mygroup» cgroup.
echo <PID> | sudo tee /sys/fs/cgroup/cpu/mygroup/cgroup.procs

Замініть фактичним PID процесу.

  1. Перевірте, чи процес перенесено до "mygroup" cgroup.
cat /sys/fs/cgroup/cpu/mygroup/cgroup.procs

!!! question "Питання"

 Чи вказаний процес у "mygroup" cgroup?

!!! question "Питання"

 Поясніть концепцію «cgroups» у Linux і те, як вони можуть керувати та контролювати розподіл ресурсів для процесів.

Вправа 13

Керування процесами за допомогою renice

Щоб налаштувати пріоритет запущеного процесу за допомогою renice

  1. Визначте запущений процес із певним PID та пріоритетом за допомогою ps.
ps -p <PID> -o ni

!!! question "Питання"

 Який поточний пріоритет (значення nice) процесу?
  1. Використовуйте команду renice, щоб змінити пріоритет запущеного процесу (значення nice).
renice <PRIORITY> -p <PID>

Замініть на нове значення пріоритету, яке ви хочете встановити, а на фактичний PID процесу.

  1. Переконайтеся, що пріоритет процесу було змінено за допомогою ps.
ps -p <PID> -o ni

!!! question "Питання"

 Зараз пріоритет інший?
  1. Поекспериментуйте зі зміною пріоритету на вищі та нижчі значення та спостерігайте за впливом на використання ресурсів процесу.

!!! question "Питання"

 Що відбувається зі споживанням ресурсів процесом із різними значеннями nice?

!!! question "Питання"

 Поясніть, як команда renice використовується для налаштування пріоритету запущених процесів і її вплив на використання ресурсів процесу.

Author: Wale Soyinka

Contributors: Steven Spencer, Ganna Zhyrnova