103.5 Урок 1
Сертифікат: |
LPIC-1 |
---|---|
Версія: |
5.0 |
Роздвл: |
103 GNU та команди Unix |
Тема: |
103.5 Створення, моніторинг та зупинка процесів |
Урок: |
1 з 2 |
Вступ
Кожен раз, коли ми викликаємо команду, запускається один або кілька процесів. Досвідченому системному адміністратору необхідно не тільки створювати процеси, а й уміти відстежувати їх і надсилати їм різні типи сигналів в разі потреби. У цьому уроці ми розглянемо контроль роботи та способи моніторингу процесів.
Керування завданнями
Завдання — це процеси, які були запущені інтерактивно через термінал, відправлені у фоновий режим і ще не завершили виконання. Ви можете дізнатися про активні завдання (та їх статус) у вашій системі Linux, запустивши jobs
:
$ jobs
Команда jobs
вище не дала жодного результату. Це означає, що на даний момент немає активних завдань. Давайте створимо наше перше завдання, запустивши команду, виконання якої займає деякий час (команда sleep
з параметром 60
) і, під час виконання, натисніть Ctrl+Z:
$ sleep 60 ^Z [1]+ Stopped sleep 60
Виконання команди було зупинено (точніше — призупинено), і командний рядок знову доступний. Ви можете пошукати завдання вдруге і наразі знайдете призупинене завдання:
$ jobs [1]+ Stopped sleep 60
Пояснимо вихідні дані:
[1]
-
Це число є ідентифікатором завдання, і його можна використовувати, якщо поставити перед ним символ відсотка (
%
), щоб змінити статус завдання за допомогою утилітfg
,bg
таkill
(як вам буде показано пізніше). +
-
Знак плюс вказує на поточне завдання за замовчуванням (тобто останнє призупинене або відправлене у фоновий режим). Попереднє завдання позначається знаком мінус (
-
). Будь-які інші попередні завдання не позначаються.
Stopped
: Опис статусу завдання.
sleep 60
-
Сама команда або завдання.
За допомогою опції -l
завдання додатково відображатимуть ідентифікатор процесу (PID) безпосередньо перед статусом:
$ jobs -l [1]+ 1114 Stopped sleep 60
Інші можливі варіанти завдання:
-n
-
Надає перелік лише процесів, статус яких змінився після останнього сповіщення. Можливий статус:
Running
,Stopped
,Terminated
абоDone
. -p
-
Наводить перелік ідентифікаторів завдань.
-r
-
Показує лише запущені завдання.
-s
-
Показує лише зупинені (або призупинені) завдання.
Note
|
Пам’ятайте, що завдання має як job ID, так і process ID (PID). |
Специфікація завдань
Команді jobs
, а також іншим утилітам, таким як fg
, bg
та kill
(які ви побачите в наступному розділі), потрібна специфікація завдання (або jobspec
) для виконання конкретного завдання. Як ми щойно бачили, це може бути, і зазвичай є, ідентифікатор завдання, перед яким стоїть %
. Однак можливі й інші специфікації завдання. Давайте подивимося на них:
%n
-
Завдання, ідентифікатор якого
n
:$ jobs %1 [1]+ Stopped sleep 60
%str
-
Завдання, командний рядок якого починається з
str
:$ jobs %sl [1]+ Stopped sleep 60
%?str
-
Завдання, командний рядок якого містить
str
:$ jobs %?le [1]+ Stopped sleep 60
%+
or%%
-
Поточне завдання (те, яке була востаннє запущене у фоновому режимі або призупинене на передньому плані):
$ jobs %+ [1]+ Stopped sleep 60
%-
-
Попереднє завдання (те, яке було
%+
до стандартного, поточне):$ jobs %- [1]+ Stopped sleep 60
У нашому випадку, оскільки завдання лише одне, воно є як поточним, так і попереднім.
Статус завдання: призупинення, передній план і фоновий режим
Для завдання, яке працює у фоновому режимі або яке призупинене, ми можемо зробити одну з трьох речей:
-
Вивести його на передній план за допомогою
fg
:$ fg %1 sleep 60
fg
переміщує вказане завдання на передній план і робить його поточним. Тепер ми можемо зачекати, поки воно закінчиться, зупинити його знову за допомогою Ctrl+Z або завершити його за допомогою Ctrl+C. -
Перенести завдання у фоновий режим можна за допомогою
bg
:$ bg %1 [1]+ sleep 60 &
Опинившись у фоновому режимі, завдання можна повернути на передній план за допомогою
fg
або видалити (див. нижче). Зверніть увагу на амперсанд (&
), який означає, що завдання було відправлено у фоновий режим. Насправді, ви також можете використовувати амперсанд, щоб почати процес безпосередньо у фоновому режимі:$ sleep 100 & [2] 970
Разом з ідентифікатором нового завдання (
[2]
) ми також отримуємо його ідентифікатор процесу (970
). Тепер обидва завдання виконуються у фоновому режимі:$ jobs [1]- Running sleep 60 & [2]+ Running sleep 100 &
Трохи пізніше завершиться виконання першого завдання:
$ jobs [1]- Done sleep 60 [2]+ Running sleep 100 &
-
Завершити його можна через сигнал
SIGTERM
за допомогоюkill
:$ kill %2
Щоб переконатися, що завдання припинено, знову запустіть
jobs
:$ jobs [2]+ Terminated sleep 100
Note
|
Якщо завдання не вказано, |
Окремі завдання: nohup
Усі завдання, які ми бачили в попередніх розділах, були приєднані до сеансу користувача, який їх викликав. Це означає, що якщо сеанс припиняється, завдання зникають. Однак можна відокремити завдання від сеансів і запустити їх навіть після закриття сеансу. Це досягається за допомогою команди nohup
(“no hup”). Синтаксис такий:
nohup COMMAND &
Пам’ятайте, &
надсилає процес у фоновий режим і звільняє термінал, в якому ви працюєте.
Давайте від’єднаємо фонове завдання ping localhost
від поточного сеансу:
$ nohup ping localhost & [1] 1251 $ nohup: ignoring input and appending output to 'nohup.out' ^C
Результат показує нам ідентифікатор завдання ([1]
) та PID (1251
), за яким слідує повідомлення про файл nohup.out
. Це файл за замовчуванням, де будуть збережені stdout
і stderr
. Тепер ми можемо натиснути Ctrl+C, щоб звільнити командний рядок, закрити сеанс, запустити інший як root
і використовувати tail -f
, щоб перевірити, чи виконується команда і чи записується вихідний результат до файлу за замовчуванням:
$ exit logout $ tail -f /home/carol/nohup.out 64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.070 ms 64 bytes from localhost (::1): icmp_seq=4 ttl=64 time=0.068 ms 64 bytes from localhost (::1): icmp_seq=5 ttl=64 time=0.070 ms ^C
Tip
|
Замість використання за замовчуванням |
Якщо ми хочемо знищити процес, ми повинні вказати його PID:
# kill 1251
Моніторинг процесів
Процес або завдання — це екземпляр запущеної програми. Таким чином, ви створюєте нові процеси щоразу, коли вводите команди в термінал.
Команда watch
періодично виконує програму (2 секунди за замовчуванням) і дозволяє нам спостерігати за змінами результатів програми з часом. Наприклад, ми можемо відстежувати, як змінюється середнє навантаження, коли запускається більше процесів, ввівши watch uptime
:
Every 2.0s: uptime debian: Tue Aug 20 23:31:27 2019 23:31:27 up 21 min, 1 user, load average: 0.00, 0.00, 0.00
Команда виконується до тих пір, поки її не перервуть, тому нам доведеться зупинити її за допомогою Ctrl+C. Ми отримуємо два рядки вихідних даних: перший відповідає watch
і говорить нам, як часто команда буде виконуватися (Every 2.0s: uptime
), яка команда/програма спостерігається (uptime
), а також ім’я хоста та дата (debian: Tue Aug 20 23:31:27 2019
). Другий рядок виведення – це час безвідмовної роботи і містить час (23:31:27
), скільки часу система працювала (up 21 min
), кількість активних користувачів (1 user
) і середнє навантаження системи або кількість процесів у виконанні або в стані очікування за останні 1, 5 і 15 хвилин (load average: 0.00, 0.00, 0.00
).
Аналогічно, ви можете перевірити використання пам’яті, оскільки нові процеси створюються за допомогою watch free
:
Every 2.0s: free debian: Tue Aug 20 23:43:37 2019 23:43:37 up 24 min, 1 user, load average: 0.00, 0.00, 0.00 total used free shared buff/cache available Mem: 16274868 493984 14729396 35064 1051488 15462040 Swap: 16777212 0 16777212
Щоб змінити інтервал оновлення для watch
, використовуйте опції -n
або --interval
плюс кількість секунд, як у:
$ watch -n 5 free
Тепер команда free
виконуватиметься кожні 5 секунд.
Щоб отримати додаткову інформацію про параметри uptime
, free
та watch
, перегляньте їх man-сторінки.
Note
|
Інформація, надана |
Надсилання сигналів до процесів: kill
Кожен процес має унікальний ідентифікатор процесу або PID. Одним із способів дізнатися PID процесу є використання команди pgrep
з назвою процесу:
$ pgrep sleep 1201
Note
|
Ідентифікатор процесу також можна знайти за допомогою команди |
Подібно до pgrep
, команда pkill
знищує процес на основі його імені:
$ pkill sleep [1]+ Terminated sleep 60
Щоб знищити декілька екземплярів одного процесу, можна використовувати команду killall
:
$ sleep 60 & [1] 1246 $ sleep 70 & [2] 1247 $ killall sleep [1]- Terminated sleep 60 [2]+ Terminated sleep 70
pkill
і killall
працюють так само, як і kill
, оскільки вони надсилають сигнал завершення вказаному процесу(ам). Якщо сигнал не надається, надсилається значення за замовчуванням SIGTERM
. Однак kill
приймає в якості аргументу лише завдання або ідентифікатор процесу.
Сигнали можна вказати як:
-
Ім’я:
$ kill -SIGHUP 1247
-
Номер:
$ kill -1 1247
-
Опцію:
$ kill -s SIGHUP 1247
Щоб kill
працював подібно до pkill
або killall
(і зберегти команди, щоб спочатку знайти PID), ми можемо використовувати заміну команд:
$ kill -1 $(pgrep sleep)
Як ви вже повинні знати, альтернативним синтаксисом є kill -1 `pgrep sleep`
.
Tip
|
Щоб отримати вичерпний список усіх сигналів |
top
та ps
Коли справа доходить до моніторингу процесів, два безцінних інструменти – це top
і ps
. У той час як перший створює вихідні дані динамічно, другий робить це статично. У будь-якому випадку, обидва є чудовими утилітами, щоб мати вичерпне уявлення про всі процеси в системі.
Взаємодія з top
Щоб викликати top
, просто введіть top
:
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
top
дозволяє користувачеві певну взаємодію. За замовчуванням вихідні дані сортуються за відсотком часу процесора, використаного кожним процесом, у порядку спадання. Цю поведінку можна змінити, натиснувши такі клавіші top
:
M
-
Сортувати за використанням пам’яті.
N
-
Сортувати за номером ідентифікатору процеса.
T
-
Сортувати за часом запуску процеса.
P
-
Сортувати за відсотком використання ЦП.
Tip
|
Щоб перемикатися між варіантами спадання/зростання, просто натисніть |
Інші цікаві ключі для взаємодії з top
:
?
абоh
-
Допомога.
k
-
Знищити процес.
top
запитаєPID
процесу, який потрібно знищити, а також сигнал (за замовчуваннямSIGTERM
або15
), який треба встановити. r
-
Змінити пріоритет процесу (
renice
).top
запитає у вас значенняnice
. Можливі значення в діапазоні від -20 до 19, але тільки суперкористувач (root
) може встановити для нього значення, яке є від’ємним або нижчим за поточне. u
-
Перелік процесів від конкретного користувача (за замовчуванням відображаються процеси від усіх користувачів).
c
-
Показати абсолютні шляхи програм і розрізнити процеси простору користувача та процеси простору ядра (у квадратних дужках).
V
-
Деревоподібний/ієрархічний вигляд процесів.
t
таm
-
Змінюйте вигляд показань ЦП і пам’яті відповідно в чотириетапному циклі: перші два натискання показують індикатори прогресу, третє приховує панель, а четверте повертає її назад.
W
-
Збережіть налаштування конфігурації в
~/.toprc
.
Tip
|
Більш вишуканою та зручнішою версією |
Пояснення результатів виведення команди top
Результат top
розділений на дві області: область підсумків і область завдань.
Область підсумків в top
Область підсумків складається з п’яти верхніх рядків і надає нам таку інформацію:
-
top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14
-
поточний час (у 24-годинному форматі):
11:20:29
-
час роботи (скільки часу система працювала):
up 2:21
-
кількість користувачів, які ввійшли до системи, і середнє навантаження на ЦП за останні 1, 5 і 15 хвилин відповідно:
load average: 0,11, 0,20, 0,14
-
-
Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
(інформація про процеси)-
загальна кількість процесів в активному режимі:
73 total
-
запущені (виконуються):
1 running
-
сплячі (ті, що чекають на відновлення виконання):
72 sleeping
-
зупинені (за сигналом керування завданням):
0 stopped
-
зомбі (ті, які завершили виконання, але все ще чекають, поки їхній батьківський процес видалить їх із таблиці процесів):
0 zombie
-
-
%Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
(відсоток витраченого часу ЦП)-
процеси користувача:
0,0 us
-
процеси системи/ядра:
0,4 sy
-
процеси, для яки встановлено значення nice — чим краще значення, тим нижчий пріоритет:
0,0 ni
-
нічого — час простою ЦП:
99,7 id
-
процеси, які очікують операції введення-виведення:
0,0 wa
-
процеси, що обслуговують апаратні переривання — периферійні пристрої надсилають процесору сигнали, які потребують уваги:
0,0 hi
-
процеси, що обслуговують програмні переривання:
0,0 si
-
процеси, що обслуговують завдання інших віртуальних машин у віртуальному середовищі, отже, крадуть час:
0,0 st
-
-
KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache
(інформація про пам’ять в кілобайтах)-
загальний обсяг пам’яті:
1020332 total
-
невикористана пам’ять:
909492 free
-
пам’ять, що використовується:
38796 used
-
пам’ять, яка буферизується та кешується, щоб уникнути надмірного доступу до диску:
72044 buff/cache
Зверніть увагу на те, що загальна сума є сумою трьох інших значень —
free
,used
іbuff/cache
(приблизно 1 ГБ у нашому випадку).
-
-
KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem
(інформація про простір підкачки в кілобайтах))-
загальна кількість простору підкачки:
1046524 total
-
невикористане місце підкачки:
1046524 free
-
місце підкачки, що використовується:
0 used
-
обсяг пам’яті підкачки, який можна виділити для процесів, не викликаючи додаткової підкачки:
873264 avail Mem
-
Область завдань у top
: поля та стовпці
Під областю підсумків знаходиться область завдань, яка містить блок полів та стовпців звітної інформації про запущені процеси:
PID
-
Ідентифікатор процесу.
USER
-
Користувач, який запустив команду, що згенерувала процес.
PR
-
Пріоритет процесу відповідно до ядра.
NI
-
Nice-значення процесу. Нижчі значення мають вищий пріоритет, ніж вищі.
VIRT
-
Загальний обсяг пам’яті, яку використовує процес (включно зі Swap).
RES
-
Оперативна пам’ять, що використовується процесом.
SHR
-
Спільна пам’ять процесу з іншими процесами.
S
-
Стан процесу. Значення включають:
S
(переривається сплячий режим — очікує завершення події),R
(можливий для виконання — або виконується, або в черзі для виконання) абоZ
(зомбі — припинені дочірні процеси, чиї структури даних ще не видалено з таблиці процесів). %CPU
-
Відсоток ЦП, що використовується процесом.
%MEM
-
Відсоток оперативної пам’яті, що використовується процесом, тобто значення
RES
, виражене у відсотках. TIME+
-
Загальний час активності процесу.
COMMAND
-
Назва команди/програми, яка створила процес.
Статичний перегляд процесів: ps
Як було сказано вище, ps
показує знімок процесів. Щоб побачити всі процеси, пов’язані з терміналом (tty), введіть ps a
:
$ ps a PID TTY STAT TIME COMMAND 386 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux 424 tty7 Ssl+ 0:00 /usr/lib/xorg/Xorg :0 -seat seat0 (...) 655 pts/0 Ss 0:00 -bash 1186 pts/0 R+ 0:00 ps a (...)
Пояснення синтаксису та виведення параметрів за допомогою ps
Що стосується опцій, ps
може приймати три різні стилі: BSD, UNIX і GNU. Давайте подивимося, як кожен із цих стилів буде працювати під час надання інформації про певний ідентифікатор процесу:
- BSD
-
Дефіс перед опціями не ставиться:
$ ps p 811 PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su
- UNIX
-
Опції вказуються після дефісу:
$ ps -p 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
- GNU
-
Опції стоять після подвійного дефісу:
$ ps --pid 811 PID TTY TIME CMD 811 pts/0 00:00:00 bash
У всіх трьох випадках ps
повідомляє інформацію про процес, PID
якого дорівнює 811
— у цьому випадку bash
.
Аналогічно, ви можете використовувати ps
для пошуку процесів, запущених конкретним користувачем:
-
ps U carol
(BSD) -
ps -u carol
(UNIX) -
ps --user carol
(GNU)
Давайте перевіримо процеси, запущені carol
:
$ ps U carol PID TTY STAT TIME COMMAND 811 pts/0 S 0:00 -su 898 pts/0 R+ 0:00 ps U carol
Вона запустила два процеси: bash
(-su
) і ps
(ps U carol
). Стовпець STAT
повідомляє нам про стан процесу (див. нижче).
Ми можемо отримати найкращі результати від ps
, поєднавши деякі його параметри. Дуже корисною командою (що створює вихідні дані, подібні до команди top
) є ps aux
(стиль BSD). У цьому випадку відображаються процеси з усіх оболонок (не тільки поточної). Значення перемикачів наступні:
a
-
Показати процеси, пов’язані з
tty
або терміналом. u
-
Формат, орієнтований на користувача.
x
-
Показати процеси, які не пов’язані з
tty
або терміналом.
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 204504 6780 ? Ss 14:04 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:04 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:04 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 14:04 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_sched] root 8 0.0 0.0 0 0 ? S 14:04 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S 14:04 0:00 [migration/0] (...)
Пояснимо стовпці:
USER
-
Власник процесу.
PID
-
Ідентифікатор процесу.
%CPU
-
Відсоток використання ЦП.
%MEM
-
Відсоток використаної фізичної пам’яті.
VSZ
-
Віртуальна пам’ять процесу в кілобайтах.
RSS
-
Фізична пам’ять (не swap), що використовується процесом у кілобайтах.
TT
-
Термінал (
tty
), який контролює процес. STAT
-
Код, що представляє стан процесу. Крім
S
,R
таZ
(які ми бачили під час опису виведенняtop
), інші можливі значення включають:D
(безперебійний сон –- зазвичай очікує введення-виведення),T
(зупинено — зазвичай керуючим сигналом). Деякі додаткові модифікатори включають:<
(високий пріоритет –- не підходить для інших процесів),N
(низький пріоритет –- зручний для інших процесів) або+
(у групі процесів переднього плану). STARTED
-
Час початку процесу.
TIME
-
Накопичений процесорний час.
COMMAND
-
Команда, яка розпочала процес.
Вправи до посібника
-
oneko
– це чудова смішна програма, що показує кішку, яка переслідує ваш курсор миші. Якщо ще не встановлено у вашій настільній системі, встановіть її за допомогою менеджера пакунків вашого дистрибутива. Ми будемо використовувати її для вивчення контролю завдань.-
Запустіть програму. Як ви це зробите?
-
Перемістіть курсор миші, щоб побачити, як кішка переслідує його. Тепер призупиніть процес. Як ви це зробите? Що виводиться?
-
Перевірте, скільки завдань у вас зараз. Що ви вводите? Які вихідні дані бачите?
-
Тепер надішліть завдання у фоновий режим, вказавши його ідентифікатор. Який вихідні дані? Як визначити, що завдання виконується у фоновому режимі?
-
Нарешті, припиніть завдання, вказавши його ідентифікатор. Що ви вводите?
-
-
Знайдіть PID усіх процесів, запущених веб-сервером Apache HTTPD (
apache2
) за допомогою двох різних команд: -
Завершіть усі процеси
apache2
без використання їхніх PID і за допомогою двох різних команд: -
Припустимо, вам потрібно припинити роботу всіх екземплярів
apache2
і ви не встигаєте дізнатися, які їхні PID. Як би ви цього досягли, використовуючиkill
із сигналомSIGTERM
за замовчуванням у вигляді одного рядку: -
Запустіть
top
і взаємодійте з ним, виконавши такі дії:-
Показати процес у вигляді дерева:
-
Показати повні шляхи процесів з розподілом на простір користувача та простір ядра:
-
-
Введіть команду
ps
, щоб відобразити всі процеси, запущені користувачем вебсервера Apache HTTPD (www-data
):-
З використанням синтаксису BSD:
-
З використанням синтаксису UNIX:
-
З використанням синтаксису GNU:
-
Дослідницькі вправи
-
Сигнал SIGHUP можна використовувати як спосіб перезапуску певних демонів. За допомогою веб-сервера Apache HTTPD, наприклад, надсилання
SIGHUP
до батьківського процесу (той, що запускаєтьсяinit
) вбиває його дочірні процеси. Батьківський процес, однак, повторно читає свої файли конфігурації, повторно відкриває файли журналів і створює новий набір дочірніх процесів. Виконайте такі завдання:-
Запустіть вебсервер:
-
Переконайтеся, що ви знаєте PID батьківського процесу:
-
Перезавантажте вебсервер Apache HTTPD, надіславши сигнал SIGHUP до батьківського процесу:
-
Перевірте, чи не було знищено батьківські процеси і чи народилися нові дочірні:
-
-
Статичні вихідні дані команди
ps
, що формуються спочатку, можна перетворити на динамічні шляхом поєднанняps
таwatch
. Ми відстежуватимемо вебсервер HTTPD Apache на наявність нових з’єднань. Перед виконанням завдань, описаних нижче, рекомендується прочитати опис директивиMaxConnectionsPerChild
у https://httpd.apache.org/docs/current/mod/mpm_common.html [Загальні директиви Apache MPM].-
Додайте директиву
MaxConnectionsPerChild
зі значенням1
у файлі конфігураціїapache2
— у Debian та похідних, які знаходяться в/etc/apache2/apache2.conf
; у сімействі CentOS, у/etc/httpd/conf/httpd.conf
. Не забудьте перезапуститиapache2
, щоб зміни вступили в силу. -
Введіть команду, яка використовує
watch
,ps
таgrep
для з’єднаньapache2
. -
Тепер відкрийте веббраузер або скористайтеся браузером командного рядка, наприклад
lynx
, щоб встановити з’єднання з вебсервером через його IP-адресу. Що ви спостерігаєте у результатахwatch
?
-
-
Як ви вже дізналися, за замовчуванням
top
сортує завдання за відсотком використання ЦП у порядку спадання (вищі значення зверху). Цю поведінку можна змінити за допомогою інтерактивних клавішM
(використання пам’яті),N
(унікальний ідентифікатор процесу),T
(час виконання) таP
(відсоток часу процесора). Однак ви також можете відсортувати список завдань на свій смак, запустившиtop
за допомогою перемикача-o
(для отримання додаткової інформації перегляньте сторінкуman
дляtop
). Тепер виконайте такі завдання:-
Запустіть
top
, щоб завдання сортувалися за використанням пам’яті: -
Переконайтеся, що ви ввели правильну команду, виділивши стовпець пам’яті:
-
-
ps
також має перемикачo
, щоб зазначити стовпці, які ви хочете показати. Дослідіть цей варіант і виконайте такі завдання:-
Запустіть
ps
, щоб відображалася лише інформація про користувача, відсоток використаної пам’яті, відсоток використаного часу ЦП та повну команду: -
Тепер запустіть
ps
, щоб відображалася лише інформація про користувача та назви програм, які він використовує:
-
Підсумки
У цьому уроці ви дізналися про завдання та контроль завдань. Важливі факти та концепції, які слід мати на увазі:
-
Завдання – це процеси, які надсилаються у фоновий режим.
-
Окрім ID процесу, завданням також призначається ID завдання під час створення.
-
Для контролю завдань потрібна специфікація завдання (
jobspec
). -
Завдання можна вивести на передній план, відправити у фоновий режим, призупинити та призупинити (або знищити).
-
Завдання можна від’єднати від терміналу та сеансу, в якому воно було створено.
Аналогічно, ми також обговорили концепцію процесів та моніторингу процесів. Найбільш актуальні ідеї:
-
Процеси запускають програми.
-
Процеси можна відстежувати.
-
Різні утиліти дозволяють нам дізнатися ID процесу, а також надіслати їм сигнали для їх завершення.
-
Сигнали можна вказати за назвою (наприклад,
-SIGTERM
), номером (наприклад,-15
) або опцією (наприклад,-s SIGTERM
). -
top
іps
дуже потужні, коли справа доходить до моніторингу процесів. Вихідні дані першого є динамічними і постійно оновлюються; з іншого боку,ps
показує статичні вихідні дані.
Команди, використані на цьому уроці:
jobs
-
Відображає активні завдання та їх статус.
sleep
-
Створює затримку на певний проміжок часу.
fg
-
Виводить завдання на перший план.
bg
-
Переміщує завдання у фоновий режим.
kill
-
Завершує завдання.
nohup
-
Від’єднує завдання від сеансу/терміналу.
exit
-
Виходить з поточної оболонки.
tail
-
Відображає останні рядки у файлі.
watch
-
Виконує команду кілька разів (за замовчуванням цикл з затримкою 2 секунди).
uptime
-
Показує, скільки часу працює система, кількість поточних користувачів і середнє навантаження системи.
free
-
Відображає використання пам’яті.
pgrep
-
Знаходить ідентифікатор процесу на основі імені.
pidof
-
Знаходить ідентифікатор процесу на основі імені.
pkill
-
Надіслає сигнал процесу за назвою.
killall
-
Знищує процес(и) за назвою.
top
-
Відображає процеси Linux.
ps
-
Показує знімок поточних процесів.
Відповіді на вправи до посібника
-
oneko
– це чудова смішна програма, що показує кішку, яка переслідує ваш курсор миші. Якщо ще не встановлено у вашій настільній системі, встановіть її за допомогою менеджера пакунків вашого дистрибутива. Ми будемо використовувати її для вивчення контролю завдань.-
Запустіть програму. Як ви це зробите?
Ввівши
oneko
в терміналі. -
Перемістіть курсор миші, щоб побачити, як кішка переслідує його. Тепер призупиніть процес. Як ви це зробите? Що виводиться?
Натиснувши комбінацію клавіш
Ctrl+z
:[1]+ Stopped oneko
-
Перевірте, скільки завдань у вас зараз. Що ви вводите? Які вихідні дані бачите?
$ jobs [1]+ Stopped oneko
-
Тепер надішліть завдання у фоновий режим, вказавши його ідентифікатор. Які вихідні дані? Як визначити, що завдання виконується у фоновому режимі?
$ bg %1 [1]+ oneko &
Кішка знову рухається.
-
Нарешті, припиніть завдання, вказавши його ідентифікатор. Що ви вводите?
$ kill %1
-
-
Знайдіть PID усіх процесів, запущених вебсервером Apache HTTPD (
apache2
) за допомогою двох різних команд:$ pgrep apache2
або
$ pidof apache2
-
Завершіть усі процеси
apache2
без використання їхніх PID і за допомогою двох різних команд:$ pkill apache2
або
$ killall apache2
-
Припустимо, вам потрібно припинити роботу всіх екземплярів
apache2
і ви не встигаєте дізнатися, які їхні PID. Як би ви цього досягли, використовуючиkill
із сигналомSIGTERM
за замовчуванням у вигляді одного рядку:$ kill $(pgrep apache2) $ kill `pgrep apache2`
або
$ kill $(pidof apache2) $ kill `pidof apache2`
NoteОскільки
SIGTERM
(15
) є сигналом за замовчуванням, не потрібно передавати жодних параметрів дляkill
. -
Запустіть
top
і взаємодійте з ним, виконавши такі дії:-
Показати процес у вигляді дерева:
Натисніть
V
. -
Показати повні шляхи процесів з розподілом на простір користувача та простір ядра:
Натисніть
c
.
-
-
Введіть команду
ps
, щоб відобразити всі процеси, запущені користувачем вебсервера Apache HTTPD (www-data
):-
З використанням синтаксису BSD:
$ ps U www-data
-
З використанням синтаксису UNIX:
$ ps -u www-data
-
З використанням синтаксису GNU:
$ ps --user www-data
-
Відповіді до дослідницьких вправ
-
Сигнал SIGHUP можна використовувати як спосіб перезапуску певних демонів. За допомогою веб-сервера Apache HTTPD, наприклад, надсилання
SIGHUP
до батьківського процесу (той, що запускаєтьсяinit
) вбиває його дочірні процеси. Батьківський процес, однак, повторно читає свої файли конфігурації, повторно відкриває файли журналів і створює новий набір дочірніх процесів. Виконайте такі завдання:-
Запустіть вебсервер:
$ sudo systemctl start apache2
-
Переконайтеся, що ви знаєте PID батьківського процесу:
$ ps aux | grep apache2
Батьківським процесом є процес, який запускає користувач root. У нашому випадку з PID
1653
. -
Перезавантажте вебсервер Apache HTTPD, надіславши сигнал SIGHUP до батьківського процесу:
$ kill -SIGHUP 1653
-
Перевірте, чи не було знищено батьківські процеси і чи народилися нові дочірні:
$ ps aux | grep apache2
Тепер ви повинні побачити батьківський процес
apache2
разом із двома новими дочірніми.
-
-
Статичні вихідні дані команди
ps
, що формуються спочатку, можна перетворити на динамічні шляхом поєднанняps
таwatch
. Ми відстежуватимемо веб-сервер HTTPD Apache на наявність нових з’єднань. Перед виконанням завдань, описаних нижче, рекомендується прочитати опис директивиMaxConnectionsPerChild
у https://httpd.apache.org/docs/current/mod/mpm_common.html [Загальні директиви Apache MPM].-
Додайте директиву
MaxConnectionsPerChild
зі значенням1
у файлі конфігураціїapache2
— у Debian та похідних, які знаходяться в/etc/apache2/apache2.conf
; у сімействі CentOS, у/etc/httpd/conf/httpd.conf
. Не забудьте перезапуститиapache2
, щоб зміни вступили в силу.Рядок, який потрібно включити до файлу конфігурації, – це
MaxConnectionsPerChild 1
. Одним із способів перезавантажити вебсервер єsudo systemctl restart apache2
. -
Введіть команду, яка використовує
watch
,ps
таgrep
для з’єднаньapache2
.$ watch 'ps aux | grep apache2'
або
$ watch "ps aux | grep apache2"
-
Тепер відкрийте веббраузер або скористайтеся браузером командного рядка, наприклад
lynx
, щоб встановити з’єднання з вебсервером через його IP-адресу. Що ви спостерігаєте у результатахwatch
?Один із дочірніх процесів, що належить
www-data
, зникає.
-
-
Як ви вже дізналися, за замовчуванням
top
сортує завдання за відсотком використання ЦП у порядку спадання (вищі значення зверху). Цю поведінку можна змінити за допомогою інтерактивних клавішM
(використання пам’яті),N
(унікальний ідентифікатор процесу),T
(час виконання) таP
(відсоток часу процесора). Однак ви також можете відсортувати список завдань на свій смак, запустившиtop
за допомогою перемикача-o
(для отримання додаткової інформації перегляньте сторінкуman
дляtop
). Тепер виконайте такі завдання:-
Запустіть
top
, щоб завдання сортувалися за використанням пам’яті:$ top -o %MEM
-
Переконайтеся, що ви ввели правильну команду, виділивши стовпець пам’яті:
Натисніть
x
.
-
-
ps
також має перемикачo
, щоб зазначити стовпці, які ви хочете показати. Дослідіть цей варіант і виконайте такі завдання:-
Запустіть
ps
, щоб відображалася лише інформація про користувача, відсоток використаної пам’яті, відсоток використаного часу ЦП та повну команду:$ ps o user,%mem,%cpu,cmd
-
Тепер запустіть
ps
, щоб відображалася лише інформація про користувача та назви програм, які він використовує:$ ps o user,comm
-